春季安全的作用和许可3

时间:2011-11-08 13:49:48

标签: spring-security

我是ss3的新手,我已经阅读了它的参考资料,我也阅读了春季安全手册。

但是我没有找到关于角色许可的任何内容。

例如,这是基于表单的身份验证的配置。

  <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'。

但我认为这不是一个好主意,因为'添加'或'删除'是权限,而不是角色。

如何制作?

此外,似乎所有角色都应该被混淆到xml文件,我想知道我是否可以动态添加新的角色和权限(在管理员页面中)?

4 个答案:

答案 0 :(得分:3)

将角色视为特权。并根据需要将它们制粒。另一件事是,也许你应该进行更多的RESTFul实现。但这是另一个主题。

例如,您的“删除”可能是“DELETE”HTTP方法。那么你可能是:

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

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

会删除ID为user的{​​{1}}。

通过RESTFul,由于uris是标识符或动作,因此在添加角色(特权)方面没有任何用处。由于这些角色旨在用于应该包含xml文件的新资源。

我担心你不能这样做,除非你使用1通配符。在我看来,如果不小心使用会导致麻烦。

答案 1 :(得分:3)

  

也许我可以添加更多角色,例如'user_admin_add'和'user_admin_delete'。

这就是方法。权限是角色,通常有人将他们之间的区别视为不需要。

我认为角色 ROLE_USER_ADDER 或权限 PERMISSION_ADD_USERS 没有太大区别。

但是,如果需要,您可以使用角色作为概念来对权限进行分组。例如,您可以拥有一个可以添加和删除用户的角色管理员。因此, ROLE_ADMIN 角色将具有 PERMISSION_ADD_USER PERMISSION_REMOVE_USER 。 Spring仍然只是作为权限来查看角色和权限。

对于添加动态角色,您可以通过从数据库加载当前用户权限来实现。看一下Spring 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

的一个很好的例子

答案 2 :(得分:2)

在我个人看来,春季安全有几个(比方说)不幸的选择名称。因此,如果您将其用于特权,请不要过多关注术语“角色”,它可以完美地运作。

在我的应用程序中,使用命名约定在Roles ans Privileges之间进行选择。 (角色写成大写,特权小写)。但要注意角色选民只会注意以“ROLE”开头的字符串(默认配置,可以更改。)

另见Spring security group based authorization

答案 3 :(得分:0)

你应该更多地考虑角色,而不是角色,而不是权限。如果要区分添加和删除用户,可以定义描述为ROLE_SALES和ROLE_USER_ADMIN的角色。销售人员可能需要能够将新用户添加到系统中。

关于角色的动态应用,您应该看一下Spring Security的体系结构。您最有可能想要使用或实施合适的UserDetailsService。请参阅UserDetailsService reference documentation

例如,如果要将用户授权信息存储在JDBC数据库中,则可能需要使用JdbcDaoImpl

namespace introduction中有一些使用不同身份验证提供程序的示例。