2012-04-23 64 views
0

我想建立一個簡單的Spring MVC/Spring Security的web應用程序,但我似乎無法找到實現這一點的方式:簡單的Spring MVC +安全設置

  1. 我想使用正常的@Secured註解,如果用戶沒有登錄,我希望他們被重定向到登錄頁面,並返回到他們所在的位置(這是我設法實現的正常行爲)
  2. 我希望登錄表單是我自己的控制器/模板對(也是常用的和成功的)。
  3. 我想要上面的登錄表單提交給我自己的控制器,它將驗證用戶憑據對我的後端寧靜服務。然後它從該服務接收安全令牌。在這一點上,我想手動將會話標記爲經過身份驗證的身份驗證並將令牌附加到它。

我該如何去實施最後階段?

回答

0

確定的答案基本上是:

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

但是能在我上面對Spring MVC的控制器控制認證過程中所描述的場景中使用它,一些其他的事情需要做:

  1. 你必須使用一個可用的身份驗證或創建一個。我發現最好是繼承AbstractAuthenticationToken。無未在此方案中使用的認證管理器
  2. 春季安全將無法啓動,所以我創建了一個空認證管理器:

    @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. 最後的春天的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> 
    
1

我不知道如果我完全理解你的問題,但如果我理解正確的話,你也許可以延長AbstractPreAuthenticatedProcessingFilter並覆蓋getPreAuthenticatedPrincipal和getPreAuthenticatedCredentials通過調用您的RESTful服務/控制器等覆蓋AuthenticationUserDetailsS​​ervice來做和probide一個簡單的服務,並添加您的安全上下文,像這樣:

<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> 
+0

嗯,這是我的意思,我知道我可以在Spring Security的鏈覆蓋某些元素,實現對我的服務的身份驗證。我想要做的是將登錄表單提交給一個普通的Spring MVC控制器(到目前爲止,Spring安全性尚未涉及)。從那年春天開始,MVC控制器對服務執行身份驗證(再次涉及spring安全)。如果到目前爲止的過程是成功的,請手動將會話標記爲Spring安全性並通過spring mvc控制器建立主體。 – 2012-04-23 18:55:15