我必须实现LoginController来登录用户,验证密码并保护一些资源或方法。
方案1) 比方说,用户没有使用系统登录。他试图访问一个方法,那时我需要重定向到login.jsp。登录过程后需要重定向到原始位置来自的正确URL。
scenario2) 让我们说用户已经登录并尝试访问一些受保护的方法。现在我需要重定向到verifyPassword.jsp以再次验证密码。
方案1对我来说很好。
我在我的security.xml中使用
<security:global-method-security
secured-annotations="enabled"
jsr250-annotations="disabled"
access-decision-manager-ref="accessDecisionManager"
/>
<security:http entry-point-ref="authEntryPoint" access-denied-page="/accessdenied.action" access-decision-manager-ref="accessDecisionManager" >
<security:intercept-url pattern="/js/**" filters="none" />
<security:anonymous/>
<security:http-basic />
<security:port-mappings >
<security:port-mapping http="8080" https="443"/>
</security:port-mappings>
<security:logout invalidate-session="true" />
<security:custom-filter position="FORM_LOGIN_FILTER" ref="customizedFormLoginFilter"/>
</security:http>
<bean id="passwordEncoder" class="org.springframework.security.authentication.encoding.ShaPasswordEncoder">
<constructor-arg index="0" value="256" />
</bean>
<bean id="roleHierarchy" class="org.springframework.security.access.hierarchicalroles.RoleHierarchyImpl">
<property name="hierarchy">
<value>
ROLE_PORTAL_RESTRICTED_USER > ROLE_USER
</value>
</property>
</bean>
<bean id="userDetailsService" class="org.springframework.security.access.hierarchicalroles.UserDetailsServiceWrapper">
<property name="userDetailsService">
<bean class="com.java.CustomeUserDetails" />
</property>
<property name="roleHierarchy" ref="roleHierarchy" />
</bean>
<bean id="authEntryPoint" class="org.springframework.security.web.authentication.AuthenticationProcessingFilterEntryPoint">
<property name="forceHttps" value="false" />
<property name="loginFormUrl" value="/login.action" />
<property name="portMapper">
<bean class="org.springframework.security.web.PortMapperImpl">
<property name="portMappings">
<map>
<entry key="8080" value="443"/>
</map>
</property>
</bean>
</property>
</bean>
<bean id="customizedFormLoginFilter"
class ="org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter" >
<property name="allowSessionCreation" value="true" />
<property name="filterProcessesUrl" value="/j_spring_security_check" />
<property name="authenticationManager" ref="authenticationManager" />
<property name="authenticationFailureHandler" ref="failureHandler" />
<property name="authenticationSuccessHandler" ref="successHandler" />
</bean>
<bean id="successHandler"
class="org.springframework.security.web.authentication.SavedRequestAwareAuthenticationSuccessHandler">
<property name="alwaysUseDefaultTargetUrl" value="false"/>
<property name="defaultTargetUrl" value="/loginsuccess.action" />
</bean>
<bean id="failureHandler"
class="org.springframework.security.web.authentication.SimpleUrlAuthenticationFailureHandler">
<property name="defaultFailureUrl" value="/loginfailed.action" />
</bean>
<security:authentication-manager alias="authenticationManager">
<security:authentication-provider user-service-ref="userDetailsService">
<security:password-encoder ref="passwordEncoder">
<security:salt-source user-property="username" />
</security:password-encoder>
</security:authentication-provider>
</security:authentication-manager>
我使用注释方法来请求登录。
@Secured("ROLE_USER")
public ModelAndView protectedMethod()
我猜想我提供了所有信息。如何为登录用户重定向到verifypin.jsp。
请给我一个建议。
答案 0 :(得分:0)
在这种情况下,Spring安全性没有开箱即用的解决方案,因此您必须自己实现它。解决方案的想法可能是:定义一个新角色“ROLE_VERIFIEDPIN”。将此角色添加到方法的安全注释中。将此角色的手写(if语句)检查添加到调用受保护方法的Web控制器方法。如果用户具有经过验证的pin角色,则调用安全方法,如果没有将其重定向到验证页面。如果验证成功,则授予他角色并调用“截获的”控制方法。