快速业务通道

Spring Security 2配置精讲 上 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-14
ingframework.security.userdetails.UserDetails#isCredentialsNonExpired()   */  public boolean isCredentialsNonExpired() {   return true;  }  /* (non-Javadoc)   * @see org.springframework.security.userdetails.UserDetails#isEnabled()   */  public boolean isEnabled() {   return !this.disabled;  }       // setters and getters }

Spring Security 2配置精讲 上(10)

时间:2011-10-16

实现UserDetails接口中的每个函数,其实没什么很大的难度,除了其中的一个函数我需要额外强调一下:

Java代码

/* (non-Javadoc)  * @see org.springframework.security.userdetails.UserDetails#getAuthorities()  */ public GrantedAuthority[] getAuthorities() {     List<GrantedAuthority> grantedAuthorities = new ArrayList<GrantedAuthority>(roles.size());     for(Role role : roles) {         grantedAuthorities.add(new GrantedAuthorityImpl(role.getName()));         }         return grantedAuthorities.toArray(new GrantedAuthority[roles.size()]); } /* (non-Javadoc)  * @see org.springframework.security.userdetails.UserDetails#getAuthorities()  */ public GrantedAuthority[] getAuthorities() {  List<GrantedAuthority> grantedAuthorities = new ArrayList<GrantedAuthority>(roles.size());     for(Role role : roles) {      grantedAuthorities.add(new GrantedAuthorityImpl(role.getName()));      }         return grantedAuthorities.toArray(new GrantedAuthority[roles.size()]); }

这个函数的实际作用是根据User返回这个User所拥有的权限列表。如果以上面曾经用过的例子来说,如果当前User是downpour,我需要得到ROLE_USER和ROLE_ADMIN;如果当前User是robbin,我需要得到ROLE_USER。

了解了含义,实现就变得简单了,由于User与Role是多对多的关系,我们可以通过User得到所有这个User所对应的Role,并把这些Role的name拼装起来返回。

由此可见,实现UserDetails接口,并没有什么神秘的地方,它只是实际上在一定程度上只是代替了使用配置文件的硬编码:

Xml代码

<user name="downpour" password="downpour" authorities="ROLE_USER, ROLE_ADMIN" /> <user name="downpour" password="downpour" authorities="ROLE_USER, ROLE_ADMIN" />

3. 实现UserDetailsService接口

Java代码

@Repository("securityManager") public class SecurityManagerSupport extends HibernateDaoSupport implements UserDetailsService {     /**      * Init sessionFactory here because the annotation of Spring 2.5 can not support override inject       *      * @param sessionFactory      */     @Autowired     public void init(SessionFactory sessionFactory) {         super.setSessionFactory(sessionFactory);     }     public UserDetails loadUserByUsername(String userName) throws UsernameNotFoundException, DataAccessException {         List<User> users = getHibernateTemplate().find("FROM User user WHERE user.name = ? AND user.disabled = false", userName);         if(users.isEmpty()) {             throw new UsernameNotFoundException("User &quo

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号