【问题标题】:Simple Spring MVC+security setup简单的 Spring MVC+安全设置
【发布时间】:2012-06-21 00:44:52
【问题描述】:

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

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

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

【问题讨论】:

    标签: java spring spring-mvc spring-security


    【解决方案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>
    

    【讨论】:

    • 这就是我的意思,我知道我可以覆盖 Spring Security 链中的某些元素来实现对我的服务的身份验证。我想要做的是将登录表单提交给普通的 Spring MVC 控制器(目前尚未涉及 Spring 安全性)。从那个 spring MVC 控制器对服务执行身份验证(同样不涉及 spring 安全性)。如果到目前为止该过程成功,则手动将会话标记为已通过 Spring 安全性进行身份验证,并从 spring mvc 控制器建立主体。
    【解决方案2】:

    好的答案基本上是:

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

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

    1. 您必须使用一种可用的身份验证 Impls 或创建一个。我发现最好继承 AbstractAuthenticationToken。
    2. 如果没有在这种情况下未使用的身份验证管理器,Spring security 将无法启动,因此我创建了一个空身份验证管理器:

      @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>
      

    【讨论】:

      最近更新 更多