Spring Security具有angular色和权限
我正在尝试设置具有权限的基于angular色的安全性。 我正在试图与Spring-Security一起做到这一点。
我不想build立ACL,因为它似乎是我的要求矫枉过正。
我只想拥有本文所述的简单权限和angular色。 不幸的是,文章没有描述如何实现给定的解决scheme。
有人已经试过这个,可以指向我的方向? 也许有另一个博客条目描述的实施?
非常感谢你。
要实现这一点,似乎你必须:
- 创build您的模型(用户,angular色,权限)和一种方法来检索给定用户的权限;
-  定义自己的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色和权限。  Role和Permission只是您编写的自定义类。  (没什么特别的 – Role有一个名字和一组Permission实例, Permission有一个名字。)然后, getAuthorities()返回如下的GrantedAuthority对象: 
  PERM_CREATE_POST , PERM_UPDATE_POST , PERM_READ_POST 
而不是像返回的东西
  ROLE_USER , ROLE_MODERATOR 
 如果您的UserDetails实现有一个getRoles()方法,angular色仍然可用。  (我build议有一个) 
 理想情况下,您可以为用户分配angular色,并自动填充关联的权限。 这将涉及到有一个自定义的UserDetailsService ,知道如何执行该映射,它只需要从数据库源映射。  (请参阅该模式的文章。) 
然后,您可以根据权限而不是angular色来定义授权规则。
希望有所帮助。
基本步骤是:
- 
使用自定义身份validation提供程 <bean id="myAuthenticationProvider" class="myProviderImplementation" scope="singleton"> ... </bean>
- 
使您的自定义提供程序返回一个自定义的 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>