Очередная задача.
Предположим, аутентификацию пользователя производит некая система, (например, сервер Апач), который устанавливает в заголовок запроса REMOTE_USER уникальное имя пользователя.
Как аутентифицировать пользователя, используя Spring-Security?
Признаюсь, сам с лёту не смог решить эту проблему.
Пришлось задать вопрос на stackoverflow.com, быстро получил ответ:
you'll need to have an auth provider. If the user name is being supplied through an HTTP header and you're just going to trust it, you're actually in what's called a pre-authenticated case (i.e., there's something else that's done the authentication step for you). The Spring Security documentation has a whole chapter on this using Siteminder as an example: just change the header name and it should work. (Well, you'll also need a user details service, so that you can map from the authenticated user to the set of authorities that they are granted, but that's a whole 'nother story.)
Конфигурация :
Остаётся написать сервис RemoteUserDetailsServiceImpl, который загружает данные пользователя и его роли по имени (REMOTE_USER), примерно так:
Предположим, аутентификацию пользователя производит некая система, (например, сервер Апач), который устанавливает в заголовок запроса REMOTE_USER уникальное имя пользователя.
Как аутентифицировать пользователя, используя Spring-Security?
Признаюсь, сам с лёту не смог решить эту проблему.
Пришлось задать вопрос на stackoverflow.com, быстро получил ответ:
you'll need to have an auth provider. If the user name is being supplied through an HTTP header and you're just going to trust it, you're actually in what's called a pre-authenticated case (i.e., there's something else that's done the authentication step for you). The Spring Security documentation has a whole chapter on this using Siteminder as an example: just change the header name and it should work. (Well, you'll also need a user details service, so that you can map from the authenticated user to the set of authorities that they are granted, but that's a whole 'nother story.)
Конфигурация :
<?xml version="1.0" encoding="UTF-8"?>
<?xml version="1.0" encoding="UTF-8"?>
<beans:beans xmlns:beans="http://www.springframework.org/schema/beans"
xmlns="http://www.springframework.org/schema/security"
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 use-expressions="true" auto-config="true">
<custom-filter position="PRE_AUTH_FILTER" ref="remoteUserFilter"/>
<intercept-url pattern="/admin/main.action" access="hasRole('ADMIN')"/>
<intercept-url pattern="/admin/updateMsgTmplCache.action" access="hasRole('PK')"/>
<intercept-url pattern="/admin/**" access="isAuthenticated()"/>
</http>
<beans:bean id="remoteUserFilter"
class="org.springframework.security.web.authentication.preauth.RequestHeaderAuthenticationFilter">
<!--<beans:property name="principalRequestHeader" value="REMOTE_USER"/>-->
<beans:property name="principalRequestHeader" value="REMOTE_USER"/>
<beans:property name="authenticationManager" ref="authenticationManager"/>
</beans:bean>
<authentication-manager alias="authenticationManager">
<authentication-provider ref="preauthAuthProvider"/>
</authentication-manager>
<beans:bean id="preauthAuthProvider"
class="org.springframework.security.web.authentication.preauth.PreAuthenticatedAuthenticationProvider">
<beans:property name="preAuthenticatedUserDetailsService">
<beans:bean id="userDetailsServiceWrapper"
class="org.springframework.security.core.userdetails.UserDetailsByNameServiceWrapper">
<beans:property name="userDetailsService" ref="userDetailsService"/>
</beans:bean>
</beans:property>
</beans:bean>
<beans:bean id="userDetailsService" class="ee.security.RemoteUserDetailsServiceImpl"/>
</beans:beans>
Остаётся написать сервис RemoteUserDetailsServiceImpl, который загружает данные пользователя и его роли по имени (REMOTE_USER), примерно так:
@Service
public class RemoteUserDetailsServiceImpl implements UserDetailsService
{
@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException, DataAccessException
{
// ToDo: here must be a real logic to load user data.
System.out.println("Authenticating user " + username);
return new UserDetailsImpl( username );
}
}
Комментариев нет:
Отправить комментарий