Добрый день !
Есть система с классической авторизацией Spring Security.
как описано тут
http://ru.wikibooks.org/wiki/Spring_Security/Ключевые_сервисы_Spring_Security
конфигурация описана ниже.
Схема классическая
есть MyAuthenticationFilter , есть UsernamePasswordAuthenticationToken , UserDetailsService с loadUserByUsername итд.
Есть база с пользователями и ролями ...
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
<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.xsd
http://www.springframework.org/schema/security
http://www.springframework.org/schema/security/spring-security-3.1.xsd">
<global-method-security jsr250-annotations="enabled" pre-post-annotations="enabled"/>
<beans:bean id="springSecurityFilterChain" class="org.springframework.security.web.FilterChainProxy">
<filter-chain-map path-type="ant">
<filter-chain pattern="/**" filters="
securityContextPersistenceFilter,
logoutFilter,
loginFormFilter,
securityContextHolderAwareFilter,
rememberMeAuthenticationFilter,
exceptionTranslationFilter,
filterSecurityInterceptor,
removeCurrentUserFilter" />
</filter-chain-map>
</beans:bean>
<beans:bean id="filterSecurityInterceptor" class="org.springframework.security.web.access.intercept.FilterSecurityInterceptor">
<beans:property name="authenticationManager" ref="authenticationManager"/>
<beans:property name="accessDecisionManager" ref="accessDecisionManager"/>
<beans:property name="securityMetadataSource">
<filter-security-metadata-source>
<intercept-url pattern="/user/**" access="ROLE_USER"/>
<intercept-url pattern="/admin/**" access="ROLE_ADMIN"/>
</filter-security-metadata-source>
</beans:property>
</beans:bean>
<beans:bean id="accessDecisionManager" class="org.springframework.security.access.vote.AffirmativeBased">
<beans:property name="decisionVoters">
<beans:list>
<beans:bean class="org.springframework.security.access.vote.RoleVoter"/>
<beans:bean class="org.springframework.security.access.vote.AuthenticatedVoter"/>
</beans:list>
</beans:property>
</beans:bean>
<beans:bean id="securityContextPersistenceFilter" class="org.springframework.security.web.context.SecurityContextPersistenceFilter">
<beans:property name="forceEagerSessionCreation" value="true"/>
</beans:bean>
<beans:bean id="securityContextHolderAwareFilter" class="org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter"/>
<beans:bean id="exceptionTranslationFilter" class="org.springframework.security.web.access.ExceptionTranslationFilter">
<beans:property name="authenticationEntryPoint" ref="loginEntryPoint"/>
</beans:bean>
<beans:bean id="logoutFilter" class="org.springframework.security.web.authentication.logout.LogoutFilter">
<beans:property name="filterProcessesUrl" value="/logout"/>
<beans:constructor-arg ref="logoutHandler"/>
<beans:constructor-arg>
<beans:list>
<beans:bean class="org.springframework.security.web.authentication.logout.SecurityContextLogoutHandler"/>
<beans:ref bean="rememberMeServices"/>
</beans:list>
</beans:constructor-arg>
</beans:bean>
<beans:bean id="rememberMeAuthenticationFilter" class="org.springframework.security.web.authentication.rememberme.RememberMeAuthenticationFilter">
<beans:property name="authenticationManager" ref="authenticationManager"/>
<beans:property name="rememberMeServices" ref="rememberMeServices"/>
</beans:bean>
<beans:bean id="loginFormFilter" class="ru.test.auth.MyAuthenticationFilter">
<beans:property name="authenticationManager" ref="authenticationManager"/>
<beans:property name="rememberMeServices" ref="rememberMeServices"/>
<beans:property name="authenticationSuccessHandler" ref="authenticationSuccessHandler"/>
<beans:property name="authenticationFailureHandler" ref="authenticationFailureHandler"/>
</beans:bean>
<beans:bean id="noOpFilter" class="ru.test.user.security.NoOpFilter"/>
<beans:bean id="authenticationManager" class="org.springframework.security.authentication.ProviderManager">
<beans:property name="authenticationEventPublisher" ref="authenticationEventPublisher"/>
<beans:property name="providers">
<beans:list>
<beans:ref bean="rememberMeAuthenticationProvider"/>
<beans:ref bean="userDetailsBasedProvider"/>
</beans:list>
</beans:property>
</beans:bean>
<beans:bean id="authenticationEventPublisher" class="org.springframework.security.authentication.DefaultAuthenticationEventPublisher"/>
<beans:bean id="userDetailsBasedProvider" class="org.springframework.security.authentication.dao.DaoAuthenticationProvider">
<beans:property name="userDetailsService" ref="userDetailsService"/>
<beans:property name="passwordEncoder" ref="passwordEncoder"/>
</beans:bean>
<beans:bean id="rememberMeAuthenticationProvider" class="org.springframework.security.authentication.RememberMeAuthenticationProvider">
<beans:property name="key" value="mykey"/>
</beans:bean>
<beans:bean id="rememberMeServices" class="org.springframework.security.web.authentication.rememberme.TokenBasedRememberMeServices">
<beans:property name="userDetailsService" ref="userDetailsService"/>
<beans:property name="key" value="mykey"/>
<beans:property name="parameter" value="remember"/>
</beans:bean>
<beans:bean class="ru.test.user.security.LoginPageController">
<beans:property name="redirectUrlResolver" ref="redirectUrlResolver"/>
</beans:bean>
<beans:bean id="loginEntryPoint" class="org.springframework.security.web.authentication.LoginUrlAuthenticationEntryPoint">
<beans:property name="loginFormUrl" value="/login"/>
</beans:bean>
<beans:bean id="redirectUrlResolver" class="ru.test.user.security.DefaultRedirectUrlResolver">
<beans:property name="defaultTargetUrl" value="/login"/>
</beans:bean>
<beans:bean id="authenticationSuccessHandler" class="ru.test.user.security.DefaultAuthenticationSuccessHandler">
<beans:property name="redirectStrategy" ref="redirectStrategy"/>
<beans:property name="redirectUrlResolver" ref="redirectUrlResolver"/>
</beans:bean>
<beans:bean id="authenticationFailureHandler" class="ru.test.user.security.DefaultAuthenticationFailureHandler">
<beans:property name="redirectStrategy" ref="redirectStrategy"/>
<beans:property name="redirectUrlResolver" ref="redirectUrlResolver"/>
</beans:bean>
<beans:bean id="logoutHandler" class="ru.test.user.security.DefaultLogoutHandler">
<beans:property name="redirectStrategy" ref="redirectStrategy"/>
</beans:bean>
<beans:bean id="passwordEncoder" class="org.springframework.security.authentication.encoding.Md5PasswordEncoder"/>
<beans:bean id="redirectStrategy" class="ru.test.user.security.BasicRedirectStrategy">
<beans:property name="performRedirect" value="true"/>
</beans:bean>
<beans:bean id="removeCurrentUserFilter" class="ru.test.user.security.RemoveCurrentUserFilter"/>
<beans:bean class="ru.test.user.security.UserContextListener"/>
<beans:bean id="onlineHolder" class="ru.test.user.implementation.online.DefaultOnlineHolder"/>
</beans:beans>
Что нужно - нужно добавить авторизацию через сторонний сервис :
т.е. где то , например в фильтре MyAuthenticationFilter - идет вызов стороннего сервиса - с набором параметров формы авторизации!
Внимание в ней три параметра !
login
username
password
идет запрос к этому сервису - он возвращает ок , если это валидный набор данных , если нет , то берем
login password
и смотрим не является ли наш это пользователь .
если сервис вернул нам ок- то тут нужно создать каким то образом фейковый Authentication
1.
2.
UsernamePasswordAuthenticationToken authRequest = new UsernamePasswordAuthenticationToken(username, password, getAuthorities());
SecurityContextHolder.getContext().setAuthentication(authRequest);
как то положить его в контекст
, создать своего пользователя или другого и самое важное организовать ему принципал , как будто этот пользователь наш из базы ...
при этом его нужно хранить где то ?
например в hashmap'е в памяти ...
Вопрос как такое организовать?
какие шаги делать и куда копать?
нудна ли своя реализация AuthenticationManager ? или есть готовая, как встроить все это в уже существующую систему?