简单的Spring MVC +安全设置

时间:2012-04-23 01:55:58

标签: java spring spring-mvc spring-security

我正在尝试建立一个简单的spring mvc / spring安全webapp,但我似乎无法找到实现这个目标的方法:

  1. 我想使用正常的@Secured注释,如果用户没有登录,我希望将它们重定向到登录页面,然后回到原来的位置(这是我的正常行为) '设法完成)
  2. 我希望登录表单成为我自己的控制器/模板对(也很常见并且已经完成)。
  3. 我希望上面的登录表单提交给我自己的控制器,该控制器将根据我的后端restful服务验证用户凭据。然后它从服务接收安全令牌。此时,我想手动将会话标记为经过身份验证的身份验证并将令牌附加到它。
  4. 我如何实施最后阶段?

2 个答案:

答案 0 :(得分:1)

我不确定我是否完全理解您的问题,但如果我理解正确,您可以扩展AbstractPreAuthenticatedProcessingFilter并覆盖getPreAuthenticatedPrincipal和getPreAuthenticatedCredentials以及对您的restful服务/控制器等的调用。覆盖AuthenticationUserDetailsS​​ervice并且发布一个简单的服务,并添加您的安全上下文,如下所示:

             

<beans:bean id="preauthAuthProvider"
            class="org.springframework.security.web.authentication.preauth.PreAuthenticatedAuthenticationProvider">
    <beans:property name="preAuthenticatedUserDetailsService">
        <beans:bean class="com.YourCompany.YourPreAuthenticatedGrantedAuthoritiesUserDetailsService"></beans:bean>
    </beans:property>
    <beans:property name="order" value="1"/>
</beans:bean>


<authentication-manager alias="authenticationManager" >
    <authentication-provider ref="preauthAuthProvider" ></authentication-provider>
</authentication-manager>

答案 1 :(得分:0)

好的答案基本上是:

SecurityContextHolder.getContext().setAuthentication(...)

但是,为了能够在我上面描述的Spring MVC控制器控制身份验证过程的场景中使用它,还需要做一些其他的事情:

  1. 您必须使用其中一个可用的身份验证Impls或创建一个。我发现最好继承AbstractAuthenticationToken。
  2. 如果没有在此方案中未使用的身份验证管理器,Spring安全性将无法启动,因此我创建了一个空身份验证管理器:

    @Service("nullAuthenticationProvider")
    public class NullAuthenticationProvider implements AuthenticationProvider
    {
        @Override
        public Authentication authenticate(Authentication authentication) throws AuthenticationException
        {
            return authentication;
        }
    
        @Override
        public boolean supports(Class<?> authentication)
        {
            return true;
        }
    }
    
  3. 最后是spring context.xml:

    <security:global-method-security secured-annotations="enabled" />
    
    <security:http disable-url-rewriting="true">
        <security:access-denied-handler error-page="/login" />
        <security:form-login login-page="/login" />
    </security:http>
    
    <security:authentication-manager>
        <security:authentication-provider ref='nullAuthenticationProvider'/>
    </security:authentication-manager>