Spring Security具有angular色和权限

我正在尝试设置具有权限的基于angular色的安全性。 我正在试图与Spring-Security一起做到这一点。

我不想build立ACL,因为它似乎是我的要求矫枉过正。

我只想拥有本文所述的简单权限和angular色。 不幸的是,文章没有描述如何实现给定的解决scheme。

有人已经试过这个,可以指向我的方向? 也许有另一个博客条目描述的实施?

非常感谢你。

要实现这一点,似乎你必须:

  1. 创build您的模型(用户,angular色,权限)和一种方法来检索给定用户的权限;
  2. 定义自己的org.springframework.security.authentication.ProviderManager并将其configuration(设置其提供者)为自定义org.springframework.security.authentication.AuthenticationProvider 。 这最后一个应该返回到它的身份validation方法身份validation,这应该设置与org.springframework.security.core.GrantedAuthority ,在您的情况下,给定的用户的所有权限。

这篇文章中的技巧是将angular色分配给用户,但是要为Authentication.authorities对象中的这些angular色设置权限。

为此,我build议你阅读API,看看你是否可以扩展一些基本的ProviderManager和AuthenticationProvider,而不是实现所有的东西。 我已经完成了org.springframework.security.ldap.authentication.LdapAuthenticationProvider设置一个自定义的LdapAuthoritiesPopulator,它将为用户检索正确的angular色。

希望这一次我得到你正在寻找的东西。 祝你好运。

我是这篇文章的作者。

毫无疑问,有多种方式可以做到这一点,但是我通常的做法是实现一个自定义的UserDetails ,它知道angular色和权限。 RolePermission只是您编写的自定义类。 (没什么特别的 – Role有一个名字和一组Permission实例, Permission有一个名字。)然后, getAuthorities()返回如下的GrantedAuthority对象:

PERM_CREATE_POSTPERM_UPDATE_POSTPERM_READ_POST

而不是像返回的东西

ROLE_USERROLE_MODERATOR

如果您的UserDetails实现有一个getRoles()方法,angular色仍然可用。 (我build议有一个)

理想情况下,您可以为用户分配angular色,并自动填充关联的权限。 这将涉及到有一个自定义的UserDetailsService ,知道如何执行该映射,它只需要从数据库源映射。 (请参阅该模式的文章。)

然后,您可以根据权限而不是angular色来定义授权规则。

希望有所帮助。

基本步骤是:

  1. 使用自定义身份validation提供程

     <bean id="myAuthenticationProvider" class="myProviderImplementation" scope="singleton"> ... </bean> 
  2. 使您的自定义提供程序返回一个自定义的UserDetails实现。 这个UserDetailsImpl将有一个getAuthorities()像这样:

     public Collection<GrantedAuthority> getAuthorities() { List<GrantedAuthority> permissions = new ArrayList<GrantedAuthority>(); for (GrantedAuthority role: roles) { permissions.addAll(getPermissionsIncludedInRole(role)); } return permissions; } 

当然,从这里你可以为你的特定需求应用很多优化/定制。

这是最简单的方法。 允许组pipe理员以及用户权限。

 -- Postgres syntax create table users ( user_id serial primary key, enabled boolean not null default true, password text not null, username citext not null unique ); create index on users (username); create table groups ( group_id serial primary key, name citext not null unique ); create table authorities ( authority_id serial primary key, authority citext not null unique ); create table user_authorities ( user_id int references users, authority_id int references authorities, primary key (user_id, authority_id) ); create table group_users ( group_id int references groups, user_id int referenecs users, primary key (group_id, user_id) ); create table group_authorities ( group_id int references groups, authority_id int references authorities, primary key (group_id, authority_id) ); 

然后在META-INF / applicationContext-security.xml中

 <beans:bean class="org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder" id="passwordEncoder" /> <authentication-manager> <authentication-provider> <jdbc-user-service data-source-ref="dataSource" users-by-username-query="select username, password, enabled from users where username=?" authorities-by-username-query="select users.username, authorities.authority from users join user_authorities using(user_id) join authorities using(authority_id) where users.username=?" group-authorities-by-username-query="select groups.id, groups.name, authorities.authority from users join group_users using(user_id) join groups using(group_id) join group_authorities using(group_id) join authorities using(authority_id) where users.username=?" /> <password-encoder ref="passwordEncoder" /> </authentication-provider> </authentication-manager>