Spring security spring security 3中的角色和权限

Spring security spring security 3中的角色和权限,spring-security,Spring Security,我是ss3新手,我读过它的参考资料,也读过spring安全手册 但是,我找不到有关角色权限的任何信息 例如,下面是基于表单的身份验证的配置 <http auto-config='true'> <intercept-url pattern="/user/add/**" access="hasRole('USER_ADMIN')"/> <intercept-url pattern="/user/delete/**" access="hasRole('

我是ss3新手,我读过它的参考资料,也读过spring安全手册

但是,我找不到有关角色权限的任何信息

例如,下面是基于表单的身份验证的配置

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

我想控制用户操作(添加/删除):


我定义了“USER_ADMIN”的角色,但这还不够,因为我想区分具有“add”权限的用户和具有“delete”权限的用户

也许我可以添加更多的角色,如“用户\管理员\添加”和“用户\管理员\删除”

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

怎么做


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

将角色视为特权。并根据需要将其颗粒化。另一件事是,也许你应该做一个更加RESTFul的实现。但这是另一条线索

例如,您的“delete”可以是一个“delete”HTTP方法。那么你可能是:

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

和一个
curl-X DELETE-u登录:密码'http://example.com/users/1“

将删除id为
1
用户

通过RESTFul,因为URI是标识符或操作,所以以友好方式添加角色(特权)是没有用的。因为这些角色是针对应该包含xml文件的新资源使用的


恐怕您不能这样做,除非您使用
**
通配符。在我看来,如果不小心使用,可能会导致麻烦。

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

关于角色的动态应用,您应该看看Spring安全性的体系结构。您很可能希望使用或实现一个合适的
UserDetailsService
。看

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


在中有一些使用不同身份验证提供者的示例。

在我个人看来,spring security有几个(比如)不幸选择的名称。所以,不要太注意“角色”这个词,如果你把它用作特权,它会非常有效

在我的应用程序中,使用命名约定在角色和权限之间进行选择。(角色以大写字母书写,权限以小写字母书写)。但是请注意角色投票者只会注意以“Role”(默认配置,可以更改)开头的字符串

另见

也许我可以添加更多的角色,如“用户\管理员\添加”和“用户\管理员\删除”

就是这样。权限是角色,通常有人认为它们之间的区别是不必要的

我认为拥有一个角色角色\用户\添加器或一个权限权限\添加\用户没有多大区别

但是,如果需要,可以使用角色作为概念来对权限进行分组。例如,您可以有一个可以添加和删除用户的角色admin。因此角色role\u ADMIN将具有添加用户权限和删除用户权限。Still spring将角色和权限都视为权限

例如,对于动态角色添加,您可以通过从数据库加载当前用户权限来完成。查看spring security的
UserDetails服务
。它返回的
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();

是实现您自己的
UserDetailsService

的一个非常好的示例,它更适合RESTFul实现吗?你能提供更多细节吗?我很感兴趣顺便说一句,动态添加角色怎么样?动态添加角色?对不起,我不明白。但是在html页面中,如何构建链接“/user/1”以使用http delete方法?通过添加角色,我的意思是系统管理员可以使用该页面添加更多角色。我可以轻松地将这些角色添加到数据库中,但是如何在ss config xml中添加它们?@hguser您想拥有动态角色并在安全配置文件中定义它们?
/**
 * 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();