2014-01-18 70 views
11

我正在使用Spring安全性以用用戶名和密碼登錄到應用程序管理部分。但是現在我的客戶端需要爲應用程序客戶端部分設置另一個登錄屏幕,他們將在其中擁有自己的用戶名/密碼以登錄到客戶端部分。到目前爲止,我已經用下面的彈簧security.xml文件設置實施管理部分成功登錄:具有多個登錄頁面的彈簧安全性

<security:http auto-config="true" use-expressions="true"> 
    <security:form-login login-page="/login" 
     default-target-url="/admin/dashboard" always-use-default-target="true" 
     authentication-failure-url="/login/admin?error_msg=wrong username or password" /> 
    <security:intercept-url pattern="/admin/*" access="hasRole('ROLE_ADMIN')" />   
    <security:logout logout-success-url="/login"/> 
</security:http> 

<security:authentication-manager> 
    <security:authentication-provider 
     user-service-ref="adminServiceImpl"> 
    </security:authentication-provider> 
</security:authentication-manager> 

我在網上搜索了很多試圖找到如何添加客戶端部分的登錄界面, intercept-url(s),安全認證提供程序,但找不到任何信息,那麼有人可以幫助我找到任何教程/示例的鏈接,指導如何做到這一點?

由於

回答

5

按照Spring Security docs

從春季安全3.1,現在有可能使用多個HTTP 元素來定義用於 不同請求模式單獨的安全過濾器鏈配置。如果pattern屬性從 中省略了一個http元素,它將匹配所有請求。

每個元素在內部FilterChainProxy中創建一個過濾器鏈,並且應該映射到它的URL模式。元素將按照它們聲明的順序添加,因此必須首先聲明最具體的模式。

所以,基本上你需要兩個<http>元素,每個元素具有不同的pattern屬性。

有一個詳細的教程在這裏:https://blog.codecentric.de/en/2012/07/spring-security-two-security-realms-in-one-application/

2

我會只用一個security:http,但註冊兩個UsernamePasswordLoginFilter秒。

如果兩個登錄頁面記錄到相同的安全領域,此解決方案將是適當的。 (因此,如果用戶登錄的登錄頁面無關緊要)。當然,對於不同類型的用戶,您仍然可以使用角色來限制應用程序不同部分的訪問權限。

該解決方案應該很容易,因爲您不需要處理兩個security:http部分。

這樣做的一個主要缺點是:如果他嘗試訪問需要登錄的頁面,則必須決定兩個登錄頁面中的哪一個登錄的用戶被重定向。

+0

非常感謝您的回覆。不幸的是我所尋求的是有兩個登錄頁面,每個人都有自己獨立的用戶表中DB,所以我想我必須遵循兩個安全:HTTP方法。 – MChan

1

具有多個登錄表單的Spring MVC App示例項目。

三種類型的頁面普通/會員/管理員。 如果您嘗試訪問會員頁面,則會將其帶入會員登錄表單。 如果您嘗試訪問管理頁面,請轉到管理員登錄表單。

https://github.com/eric-mckinley/springmultihttploginforms

利用在seucrity XML配置文件中的正則表達式的螞蟻請求匹配完成。

<beans:beans xmlns="http://www.springframework.org/schema/security" 
     xmlns:beans="http://www.springframework.org/schema/beans" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xsi:schemaLocation="http://www.springframework.org/schema/beans 
       http://www.springframework.org/schema/beans/spring-beans-3.0.xsd 
       http://www.springframework.org/schema/security 
       http://www.springframework.org/schema/security/spring-security.xsd"> 

<global-method-security secured-annotations="enabled" /> 

<http name="member" pattern="/member/*" request-matcher="ant" auto-config="true" use-expressions="false"> 
    <csrf disabled="true"/> 

    <intercept-url pattern="/member/home" access="ROLE_MEMBER" /> 
    <intercept-url pattern="/member/account" access="ROLE_MEMBER" /> 
    <intercept-url pattern="/member/orders" access="ROLE_MEMBER" /> 

    <form-login login-page="/member-login" always-use-default-target="false"/> 
    <logout logout-url="/logout" logout-success-url="/home"/> 
</http> 

<http name="admin" request-matcher="regex" auto-config="true" use-expressions="false"> 
    <csrf disabled="true"/> 

    <intercept-url pattern="/admin/home" access="ROLE_ADMIN" /> 
    <intercept-url pattern="/admin/users" access="ROLE_ADMIN" /> 

    <form-login login-page="/admin-login" always-use-default-target="false"/> 
    <logout logout-url="/logout" logout-success-url="/home"/> 
</http> 

<authentication-manager> 
    <authentication-provider> 
     <user-service> 
      <user name="admin" password="password" authorities="ROLE_ADMIN" /> 
      <user name="member" password="password" authorities="ROLE_MEMBER" /> 
      <user name="super" password="password" authorities="ROLE_ADMIN,ROLE_MEMBER" /> 
     </user-service> 
    </authentication-provider> 
</authentication-manager>