Пользовательская аутентификация в Spring - PullRequest
4 голосов
/ 08 июля 2010

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

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

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

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

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

Ответы [ 3 ]

5 голосов
/ 14 августа 2010

Вы можете создать пользовательский провайдер аутентификации, который реализует 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));
    }

}

Еще один шаг - настроить Spring Security для использования этого провайдера аутентификации

<?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>
3 голосов
/ 08 июля 2010

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

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

  • Создайте Authentication, содержащее имя пользователя и предоставленные роли (вы можете использовать UsernamePasswordAuthenticationToken в качестве удобной реализации).
  • Поместите его в контекст безопасности:
    SecurityContextHolder.getContext().setAuthentication(auth);
  • Передайте событие успешной аутентификации, используя AuthenticationEventPublisher.publishAuthenticationSuccess(...) (вы можете автоматически связать его из контекста или явно создать 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, может быть, лучше избегать таких массовых настроек и использовать обычную архитектуру Spring Security.

2 голосов
/ 08 июля 2010

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

  • Фильтр аутентификации - считывает данные из запроса, затем вызывает провайдер аутентификации с токеном учетных данных (экземпляр класса Authentication)
  • Провайдер аутентификации - принимает эту аутентификациютокен (фильтр может создавать разные токены, и могут быть разные поставщики аутентификации для каждого типа токена), и попытаться пройти аутентификацию (вызывая вашу службу, в вашем случае).После авторизации вы можете (или не можете) вызывать службу сведений о пользователе или заполнять все данные пользователя прямо здесь
  • Служба сведений о пользователе - загружать зарегистрированные данные пользователя откуда-то (из jdbc, другого сервиса и т. Д.)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...