2010-02-23 60 views
3

我正在使用Hibernate 3(使用JPA註解),Spring 2.5和Spring Security 2.0.5構建應用程序。如何使用Hibernate 3 Annotated Classes配置Spring Security 2數據庫身份驗證?

我想知道我需要在我的spring security配置文件(applicationContext-security.xml)中放入我的<authentication-provider>標記,這樣我就可以使Spring Security使用我現有的服務層類(AuthenticationService)來處理我的自定義用戶和角色域對象。

我理解的Spring Security需要兩個表存在與下面的模式:

 create table users(
     username varchar_ignorecase(50) not null primary key, 
     password varchar_ignorecase(50) not null, 
     enabled boolean not null); 

    create table authorities (
     username varchar_ignorecase(50) not null, 
     authority varchar_ignorecase(50) not null, 
     constraint fk_authorities_users foreign key(username) references users(username)); 

    create unique index ix_auth_username on authorities (username,authority);; 

,但我想用這對上表中定義不同的我自己的域對象。

難道有人請在這裏指出正確的方向嗎?我找不到任何有用的文檔,我不確定我想要做的事實際上是否可行。

謝謝!

回答

8

您可以實現自定義UserDetailsService作爲您的域和Spring Security之間的橋樑。然後你用它提供的Spring Security如下(爲春季安全2.X):

<security:authentication-provider user-service-ref='myUserDetailsService'/> 

<bean id="myUserDetailsService" class="... your implementation ..."> 
    ... 
</bean> 
1

定義自定義AutenticationManager使用<bean id="myAuthenticationManager" class="com.security.MyAuthunticationManager"/>MyAutenticationManager類應該實現org.springframework.security.AuthenticationManager和覆蓋的方法authenticate(Authentication authentication)中,你會使用自定義的服務和域對象來驗證用戶憑據,並添加自己的角色來驗證對象。

+0

這是矯枉過正。自定義UserDetailsS​​ervice就足夠了。 – axtavt 2010-02-23 15:41:05

1

不要說了什麼axtavt,或者如果你什麼都不需要多打一個自定義表,則可以覆蓋查詢:

<security:authentication-provider> 
    <jdbc-user-service data-source-ref="dataSource" 
     authorities-by-username-query="SELECT u.username, a.authority FROM users u, authorities a WHERE u.username = a.username AND u.username = ?" /> 
     users-by-username-query="SELECT username, password, enabled FROM users WHERE username = ?" /> 
</security:authentication-provider> 

雖然我會做什麼axtavt建議。您可以創建一個實現Spring Security用戶對象的DTO(數據傳輸對象)。這將允許您從SecurityContextHolder中獲取用戶訪問時的相關數據:

Object o = SecurityContextHolder.getContext().getAuthentication().getDetails(); 
UserDetailsDTO u = (UserDetailsDTO) o; 
User user = u.getUser(); 
// now you have primary key, etc., etc. 

你真的不需要那麼現在看你的表,但IMO,你的模式需要的工作。

相關問題