2010-02-08 109 views
14

我在Spring/Java EE web應用程序中設置了基本的spring security。我可以限制訪問某些頁面並強制登錄(與角色等)。需要有一個表格,新用戶可以註冊並指定登錄名和密碼。在Spring Security中添加新用戶

我想知道如果要創建新用戶,我只是簡單地查詢和更新適當的彈簧安全表(例如使用hibernate),就像我爲任何查詢所做的那樣,或者是否有內置的創建新用戶的功能?如果我只是使用標準的DAO來更新用戶,我應該如何處理密碼的哈希?

謝謝!

回答

1

在春季安全中沒有用於創建用戶的內置功能。它僅用於根據試圖登錄和訪問資源的用戶的規則來保護資源。

+0

感謝 - 所以基本上,正確的方法是使用只更新適當的彈簧安全表我的DAO? – james 2010-02-08 21:14:55

+0

是的。您應該有單獨的控制器/流程來處理註冊 – 2010-02-08 21:40:38

1

要使用散列算法您可以將<password-encoder>添加到<authentication-provider>

+0

這將如何影響添加新用戶流程?大概會有一個表單,用戶輸入用戶名和密碼等,然後將其插入數據庫。所以我不確定如何使用會影響這個?我假設我需要在插入前手動散列密碼。 – james 2010-02-08 21:19:38

+1

<密碼編碼器>僅用於授權過程。它將幫助您將用戶鍵入的密碼與數據庫中的密碼進行比較。 但數據庫中的密碼您必須手動哈希。 – 2010-02-08 21:25:27

+0

-1無關的答案 – 2010-02-08 21:40:04

4

Spring Security有JdbcUserDetailsManager。它是基於JDBC的默認UserDetailsService的子類,具有創建用戶等的其他方法。您可以將它用作DAO而不是您自己的。

但密碼散列應該明確處理。例如,如果您使用SHA散列,則可以使用。

12

你必須結合本頁面上的所有答案。

  • Teja是正確的,有沒有便利的方式來添加用戶在飛行中。
  • Axtavt也是正確的。您需要某種數據訪問/服務層來更新您的用戶表。換句話說,你需要像任何其他頁面一樣創建視圖,並擁有某種超級用戶訪問權限。
  • Michal和ax提供了很好的建議,您可能需要在保存密碼之前對其進行編碼。摘要應該與您在檢索憑證時使用的任何內容匹配。

下面是一個例子使用JDBC配置:

<?xml version="1.0" encoding="UTF-8"?> 
<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-2.0.xsd 
         http://www.springframework.org/schema/security 
         http://www.springframework.org/schema/security/spring-security-2.0.1.xsd"> 

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

    <http auto-config="true" access-denied-page="/accessDenied.jsp"> 
     <!-- login page has anonymous access --> 
     <intercept-url pattern="/login.jsp*" filters="none"/> 
     <!-- all pages are authenticated --> 
     <intercept-url pattern="/**.action" access="ROLE_USER, ROLE_ADMIN" /> 
     <!-- all admin contextual pages are authenticated by admin role --> 
     <intercept-url pattern="/admin/**" access="ROLE_ADMIN" /> 
     <form-login authentication-failure-url="/login.jsp?login_error=1" default-target-url="/index.action" login-page="/login.jsp"/> 
     <logout logout-success-url="/index.action"/> 
    </http>  

    <authentication-provider> 
     <password-encoder hash="md5" /> 
     <jdbc-user-service data-source-ref="dataSource" 
      authorities-by-username-query="SELECT username, role AS authority FROM sweet_users WHERE username = ?" 
      users-by-username-query="SELECT username, password, 1 AS enabled FROM sweet_users WHERE username = ?" /> 
    </authentication-provider> 
</beans:beans> 

這是使用自定義查詢來獲取用戶。 Spring Security需要分別使用用戶名,密碼和權限列名稱的用戶表,因此,您需要做的是返回這些用戶表。您需要提供數據源。

如果您創建了一個用於在admin/context下添加用戶的頁面,它將根據此配置進行身份驗證。

添加豆你的UserDAO和/或UserService和/或的AuthenticationService並將它傳遞給你的用戶控制器...