2011-11-08 53 views
4

我是ss3中的新手,我已經閱讀了它的參考資料,也讀過了春季安全書。春季安全中的角色和權限3

但是我沒有找到任何有關角色權限的信息。

例如,這裏是基於表單的身份驗證配置。

<http auto-config='true'> 
    <intercept-url pattern="/user/add/**" access="hasRole('USER_ADMIN')"/> 
    <intercept-url pattern="/user/delete/**" access="hasRole('USER_ADMIN')"/> 
    <intercept-url pattern="/login.jsp*" access="IS_AUTHENTICATED_ANONYMOUSLY"/> 
    <intercept-url pattern="/**" access="ROLE_USER" /> 
    <form-login login-page='/login.jsp'/> 
    </http> 

我想控制用戶操作(添加/刪除):

<intercept-url pattern="/user/add/**" access="hasRole('USER_ADMIN')"/> 
<intercept-url pattern="/user/delete/**" access="hasRole('USER_ADMIN')"/> 

我定義的「USER_ADMIN」的角色,但這是不夠的,因爲我想不同的用戶誰具有「刪除」權限的用戶擁有「添加」權限。

也許我可以添加更多的像「user_admin_add」和'user_admin_delete的角色。

但我不認爲這是一個好主意,因爲'添加'或'刪除'是權限,而不是角色。

如何製作它?

而且,似乎所有的角色應的ConfigEd到XML文件,我不知道如果我能(在管理員頁面)動態地添加新的角色和權限?

回答

3

將角色視爲特權。並根據需要將它們造粒。另一件事是,也許你應該做一個更多的RESTFul實現。但這是另一個線索。

例如,您的「刪除」可能是一個「DELETE」HTTP方法。然後,你可以:

<security:intercept-url pattern="https://stackoverflow.com/users/*" method="DELETE" access="ROLE_DELETE_USER" /> 

curl -X DELETE -u login:password 'http://example.com/users/1'

將與ID 1刪除user

通過一個寧靜的,因爲URI是要麼識別符或動作,還有在添加角色(權限)dinamically沒有用。由於這些角色旨在用於應包含xml文件的新資源。

恐怕你不能做到這一點,除非你使用**通配符。在我看來,如果使用不當可能會導致麻煩。

+0

更舒適的實現?你能提供更多細節嗎?我很感興趣。順便說一句,如何動態添加角色? – hguser

+0

添加角色dinamically?我不明白對不起。 – ssedano

+0

但在html頁面中,如何建立鏈接'/ user/1'以使用http刪除方法? – hguser

0

你應該考慮角色更多的角色,而不是權限。如果您想區分添加和刪除用戶,則可以將角色定義爲ROLE_SALES和ROLE_USER_ADMIN。銷售人員可能需要能夠將新用戶添加到系統中。

關於角色的動態應用,你應該看看Spring Security的體系結構。你很可能會想要使用或實現一個合適的UserDetailsService。請參閱UserDetailsService reference documentation

如果你存儲在一個JDBC數據庫用戶授權信息,例如,您可能希望使用JdbcDaoImpl

中有namespace introduction使用不同的身份驗證提供的一些示例。

2

我個人認爲春季安全有幾個(可以說)遺憾的是選擇的名稱。因此,如果您使用它來獲得特權,請不要太在意「術語」角色「的作用。

在我的應用程序使用的命名約定,以角色ANS特權之間進行選擇。 (角色被寫成大寫,小寫的特權)。但要注意的角色選民會注意只有與「角色」開始的字符串(默認配置,是可以改變的。)

參見Spring security group based authorization

2

也許我可以添加更多的像「user_admin_add角色'和'user_admin_delete'。

這是正路。權限是角色,通常有人認爲它們之間的區別是不需要的。

我不認爲這是在具有作用ROLE_USER_ADDER或許可PERMISSION_ADD_USERS太大的差別。

如果需要,您可以使用,無論角色作爲一個概念來組的權限。例如,你可以有一個角色管理員,可以添加和刪除用戶。所以角色ROLE_ADMIN將有PERMISSION_ADD_USERPERMISSION_REMOVE_USER。春天仍然會將角色和權限視爲權威。

至於添加,你可以從你的DB例如加載當前用戶權限做動態角色。看看春季安全的UserDetailsService。它返回的UserDetails對象有一個getAuthorities()方法,您可以從數據庫中填充該方法。

/** 
* Returns the authorities granted to the user. Cannot return <code>null</code>. 
* 
* @return the authorities, sorted by natural key (never <code>null</code>) 
*/ 
Collection<GrantedAuthority> getAuthorities(); 

Here是實現自己的UserDetailsService的一個很好的例子。