0

我正在尝试设置一个简单的 spring mvc / spring security webapp,但我似乎找不到实现此目的的方法:

  1. 我想使用普通的 @Secured 注释,如果用户没有登录,我希望他们被重定向到登录页面,然后回到他们所在的位置(这是我管理的正常行为去完成)
  2. 我希望登录表单成为我自己的控制器/模板对(也很常见且已完成)。
  3. 我希望将上面的登录表单提交给我自己的控制器,该控制器将针对我的后端 RESTful 服务验证用户凭据。然后它从服务接收一个安全令牌。此时,我想手动将会话标记为经过身份验证的身份验证并将令牌附加到它。

我如何着手实施最后一个阶段?

4

2 回答 2

1

我不确定我是否完全理解您的问题,但如果我理解正确,您可以扩展 AbstractPreAuthenticatedProcessingFilter 并通过调用您的 restful 服务/控制器等覆盖 getPreAuthenticatedPrincipal 和 getPreAuthenticatedCredentials。覆盖 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>
于 2012-04-23T09:13:13.873 回答
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>
    
于 2012-04-23T23:40:47.160 回答