2010-07-08 7 views
4

У меня есть вопрос. В Struts у меня есть действие, которое касается аутентификации пользователя, то есть я взял учетные данные пользователя и использовал DAO для проверки учетных данных пользователя. Я хочу поддерживать ту же настройку весной. Я использую Spring 3.0.3 RELEASE.Пользовательская аутентификация весной

Мой вопрос в том, что я прочитал Spring Security и там он указывает провайдера JDBC «Проверка». Я хочу знать, как бы, если бы пользователь нажал «login», чтобы он передал учетные данные моему контроллеру, чтобы проверить правильность проверки подлинности?

Причина, по которой я хочу сделать это, заключается в том, что у меня есть Служба, которая обрабатывает аутентификацию пользователя и авторизацию.

Заранее спасибо.

PS Как сделать некоторый контроллер безопасным весной?
PPS Я новичок в Spring

ответ

2

Вы можете написать собственный механизм вы валидации для Spring Security. Он должен состоит из следующих частей:

  • Auth Filter - считывает данные из запроса, а затем вызвать Auth Provider с учетными данными маркеров (экземпляр класса Authentication)
  • Auth Provider - принимает этот токен аутентификации (фильтр может создавать разные токенов, а также могут быть разные провайдеры аутентификации, для каждого типа токена) и попытаться выполнить аутентификацию (вызов вашей службы по вашему делу). После AUTH вы можете (или не может) вызов пользователь Подробность службы или заполнить все пользовательские данные прямо
  • пользователя Деталь Service - нагрузки подписаны в деталях пользователя откуда-то (от JDBC, других служб и т.д.)
+0

Хорошо, видя, что я новичок @ Spring, как бы я это сделал? –

+0

@ The Elite: Это не ваше дело. – axtavt

+0

@axtavt: Elite заявила, что ему нужно аутентифицировать пользователей с помощью отдельной службы. Если это так, то он должен написать, по крайней мере, свой собственный поставщик Auth. Или я что-то не понял? –

3

, как правило, Spring Security обрабатывает аутентификацию внутри своего собственного кода, используя ваш код как стратегии (поставщики аутентификации, службы пользовательских данных и т. Д.). Но вы можете обрабатывать аутентификацию внутри своего собственного кода.

В коде действий пользователя, когда учетные данные правильны, то:

  • Создание Authentication, содержащее имени пользователя и предоставленные роли (вы можете использовать UsernamePasswordAuthenticationToken в качестве удобной реализации).
  • Положите его в контекст безопасности:
    SecurityContextHolder.getContext().setAuthentication(auth);
  • Broadcast событие успеха аутентификации с помощью AuthenticationEventPublisher.publishAuthenticationSuccess(...) (вы можете autowire его из контекста или создать DefaultAuthenticationEventPublisher явно).
  • Перенаправить пользователя на защищенный ресурс, используя SavedRequestAwareAuthenticationSuccessHandler.onAuthenticationSuccess(...).

Кроме того, необходимо поставить в AuthenticationEntryPoint:

<bean id = "aep" class = "org.springframework.security.web.authentication.LoginUrlAuthenticationEntryPoint"> 
    <!-- Your login page --> 
    <property name = "loginFormUrl" value = "/login" /> 
</bean> 

<security:http entry-point-ref="aep"> 
    ... 
</http> 

Однако, если вы на самом деле новые весной, может быть лучше, чтобы избежать таких массивные настроек и использовать обычные архитектуры Spring Security.

5

Вы можете создать пользовательские аутентификации, который реализует org.springframework.security.authentication.AuthenticationProvider как этот

package com.bzone.example; 

import org.springframework.security.authentication.AuthenticationProvider; 
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; 
import org.springframework.security.core.Authentication; 
import org.springframework.security.core.AuthenticationException; 


public class CustomAuthenticationProvider implements AuthenticationProvider{ 

    @Override 
    public Authentication authenticate(Authentication authentication) 
      throws AuthenticationException { 
     // TODO call custom service or do whatever you want 
     return null; 
    } 

    @Override 
    public boolean supports(Class<? extends Object> authentication) { 
     // copied it from AbstractUserDetailsAuthenticationProvider 
     return (UsernamePasswordAuthenticationToken.class.isAssignableFrom(authentication)); 
    } 

} 

еще один шаг заключается в настройке пружины безопасности использовать этот обычай поставщик проверки подлинности

<?xml version="1.0" encoding="UTF-8"?> 
<beans:beans xmlns="http://www.springframework.org/schema/security" 
    xmlns:beans="http://www.springframework.org/schema/beans" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd 
         http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security-3.0.xsd"> 

    <!-- HTTP security configurations --> 
    <http auto-config="true" use-expressions="true"> 
     <form-login login-processing-url="/static/j_spring_security_check" login-page="/login" authentication-failure-url="/login?login_error=t"/> 
     <logout logout-url="/static/j_spring_security_logout"/> 

     <!-- Configure these elements to secure URIs in your application --> 
     <intercept-url pattern="/member/**" access="isAuthenticated()" /> 
     <intercept-url pattern="/resources/**" access="permitAll" /> 
     <intercept-url pattern="/static/**" access="permitAll" /> 
     <intercept-url pattern="/**" access="permitAll" /> 
    </http> 

    <!-- Configure Authentication mechanism --> 
    <authentication-manager alias="authenticationManager"> 
     <authentication-provider ref="com.bzone.example.CustomAuthenticationProvider" /> 
    </authentication-manager> 

</beans:beans> 
+0

исправьте меня, если я ошибаюсь, но я думаю, что это немедленно происходит в переопределенном 'authenticate()' методе, а не в контроллере. – Oneb