Spring安全预认证成功处理程序
问题描述:
我有一个web应用程序,您可以使用form-login登录,或者您可以进行预先认证并以此登录。这两种方法都能正常工作,但我只能通过使用authentication-success-handler-ref属性来使用form-login成功处理程序。Spring安全预认证成功处理程序
我的问题是,我怎样才能在我的安全应用程序上下文中为PRE_AUTH_FILTER调用成功处理程序“mySuccessHandler”?我想我可以将它称为PreAuthenticatedProcessingFilter,preauthAuthProvider或自定义过滤器下的属性或其他内容。
如果用户具有教师或学生的角色,只需转到不同的页面。
<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.2.xsd">
<http pattern="/**" use-expressions="true" create-session="always">
<intercept-url pattern="/login.jsp*" access="permitAll" />
<intercept-url pattern="/**/ErrorPages/**" access="permitAll" />
<intercept-url pattern="/**/Students/**" access="hasAnyRole('STUDENT, TEACHER')" />
<intercept-url pattern="/**/Teacher/**" access="hasRole('TEACHER')" />
<intercept-url pattern="/**/Login/**" access="hasRole('ROLE_USER')" />
<intercept-url pattern="/**/Js/**" access="hasRole('ROLE_USER')" />
<intercept-url pattern="/**/Css/**" access="permitAll" />
<intercept-url pattern="/**/Img/**" access="permitAll" />
<intercept-url pattern="/**/api/**" access="hasRole('ROLE_USER')" />
<intercept-url pattern="/**" access="denyAll" />
<custom-filter position="PRE_AUTH_FILTER" ref="PreAuthenticatedProcessingFilter" />
<access-denied-handler
<form-login
username-parameter="idnumber"
password-parameter="password" login-processing-url="/athuga_innskraningu"
login-page='/login.jsp'
authentication-failure-handler-ref="myAuthErrorHandler"
authentication-success-handler-ref="mySuccessHandler"
always-use-default-target='true'
authentication-failure-url="/login.jsp?login_error=true"/>
<logout logout-url="/utskra/" logout-success-url="/login.jsp"/>
</http>
<beans:bean id="mySuccessHandler" class="is.inna.rest.login.AuthenticationSuccess"/>
<beans:bean id="myAuthErrorHandler" class="is.inna.rest.login.AuthenticationFailure"/>
<beans:bean id="passwordEncoder" class="org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder"/>
<beans:bean name="myUserDetailsService" class="is.inna.rest.login.UserDetailServiceLogin" />
<beans:bean id="userDetailsServiceWrapper" class="is.inna.rest.login.UserDetailServicePreAuth" />
<authentication-manager alias="authenticationManager">
<authentication-provider user-service-ref="myUserDetailsService">
<password-encoder ref="passwordEncoder" />
</authentication-provider>
<authentication-provider ref="preauthAuthProvider" />
</authentication-manager>
<beans:bean id="preauthAuthProvider" class="org.springframework.security.web.authentication.preauth.PreAuthenticatedAuthenticationProvider">
<beans:property name="preAuthenticatedUserDetailsService" ref="userDetailsServiceWrapper"/>
</beans:bean>
<beans:bean id="PreAuthenticatedProcessingFilter" class="is.inna.rest.login.PreAuthenticatedProcessingFilter">
<beans:property name="authenticationManager" ref="authenticationManager" />
</beans:bean>
答
你的要求是用户重定向到根据角色不同的页面。你也可以使用认证成功处理程序来完成此操作请参考我写的样本success handler。在重写的onAuthenticationSuccess
方法中,您始终可以访问Authentication
对象。您可以获取登录用户的权限和角色,并且根据此用户,您始终可以将用户重定向到适当的页面。
希望这会有所帮助。
感谢您的评论,我让成功处理程序完全和你一样。并在我的security-context.xml文件中添加 。但是成功处理程序中的代码永远不会被调用,为什么会这样呢? –
bjozzi
2014-09-02 14:10:32
是的,你正在调用authentication-success-handler-ref =“authHandler”,它使用了SavedRequestAwareAuthenticationSuccessHandler,但是当我使用pre-auth过滤器时,我需要知道如何调用它。 – bjozzi 2014-09-02 14:24:12
为什么在认证之前调用处理程序已完成?只有当它变成一个有效的用户时,才能将用户重定向到不同的页面。因此,使用身份验证成功处理程序是一种正确的方法 – 2014-09-03 04:51:02