2011-11-08 58 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的一个很好的例子。