这篇主要的内容是
通过自定义Spring Security的默认实现来进行用户和权限的管理
通过第六篇和第七篇的铺垫 现在开始这篇的实验,第六篇中我们可以自定义自己的用户和权限表结构了
但是 我们必须确保我们的SQL 语句返回的列与Spring Security 所期待的一样 是因为我们仍然使用的是
SpringSecurity的默认实现,那么这篇我们自己实现SpirngSecurity对用户和权限的管理.
学习资料 来自 这个大哥的博客 http://downpour.iteye.com/blog/319965
准备工作:
在此之前我们自定义的用户表和权限表 是一个多对多的关系 通过中间表进行关联.
那么这里我们在程序里要怎样进行 映射 当然可以使用MyEclipses的反向工程,
这里我们手动的创建用户类和权限类之间的单向多对多关联
annotation 注解方式 完成映射. 使用hibernate 帮助我们方便进行数据库操作
1.创建User类(用户类)与数据库tb_users表 对应
package zyk.entity; import java.io.Serializable; import java.util.Set; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.FetchType; import javax.persistence.GeneratedValue; import javax.persistence.Id; import javax.persistence.JoinColumn; import javax.persistence.JoinTable; import javax.persistence.ManyToMany; import javax.persistence.Table; import org.hibernate.annotations.Cache; import org.hibernate.annotations.CacheConcurrencyStrategy; import org.hibernate.annotations.Proxy; @SuppressWarnings("serial") @Entity @Table(name = "tb_users") @Proxy(lazy = false) @Cache(usage = CacheConcurrencyStrategy.READ_WRITE) public class User implements Serializable { private int id; private String name; private String pwd; private String enabled; private Set<Role> roles; @Id @GeneratedValue public int getId() { return id; } public void setId(int id) { this.id = id; } @Column(name = "c_username") public String getName() { return name; } public void setName(String name) { this.name = name; } @Column(name = "c_password") public String getPwd() { return pwd; } public void setPwd(String pwd) { this.pwd = pwd; } @Column(name = "c_enabled") public String getEnabled() { return enabled; } public void setEnabled(String enabled) { this.enabled = enabled; } @ManyToMany(targetEntity = Role.class, fetch = FetchType.EAGER) @JoinTable(name = "tb_user_role", joinColumns = @JoinColumn(name = "c_user_id"), inverseJoinColumns = @JoinColumn(name = "c_role_id")) @Cache(usage = CacheConcurrencyStrategy.READ_WRITE) public Set<Role> getRoles() { return roles; } public void setRoles(Set<Role> roles) { this.roles = roles; } }
2.创建Role类(权限类)与数据库tb_role表 对应
package zyk.entity; import java.io.Serializable; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.Id; import javax.persistence.Table; import org.hibernate.annotations.Cache; import org.hibernate.annotations.CacheConcurrencyStrategy; /** * 权限类 * */ @SuppressWarnings("serial") @Entity @Table(name = "tb_role") @Cache(usage = CacheConcurrencyStrategy.READ_WRITE) public class Role implements Serializable { private int id; private String authority; @Id @GeneratedValue public int getId() { return id; } public void setId(int id) { this.id = id; } @Column(name = "c_authority") public String getAuthority() { return authority; } public void setAuthority(String authority) { this.authority = authority; } }
单向的多对多关联关系建立OK。。
Spring Security的用户和权限的管理的具体实现
1.分别实现接口 GrantedAuthority (权限),UserDetails(用户详细信息) ,UserDetailsService(用户信息管理)
1.1 创建MyGrantedAuthority
package zyk.security; import org.springframework.security.core.GrantedAuthority; /** * 权限类. * */ public class MyGrantedAuthority implements GrantedAuthority { private static final long serialVersionUID = 1L; private String authority; public MyGrantedAuthority() { } public MyGrantedAuthority(String authority) { this.authority = authority; } //返回权限字串 public String getAuthority() { return this.authority; } }
1.2 创建MyUserDetails
package zyk.security; import java.util.ArrayList; import java.util.Collection; import java.util.List; import java.util.Set; import org.springframework.security.core.GrantedAuthority; import org.springframework.security.core.userdetails.UserDetails; import zyk.entity.Role; import zyk.entity.User; /** * 用户信息详细类 * */ public class MyUserDetails implements UserDetails { private static final long serialVersionUID = 1L; public MyUserDetails() { } public MyUserDetails(User user) { this.user = user; } private User user; //获得该用户的所有权限 public Collection<GrantedAuthority> getAuthorities() { Set<Role> roles = this.user.getRoles(); List<GrantedAuthority> grantedAuthoritys = new ArrayList<GrantedAuthority>( roles.size()); for (Role role : roles) { GrantedAuthority grantedAuthority = new MyGrantedAuthority( role.getAuthority()); grantedAuthoritys.add(grantedAuthority); } return grantedAuthoritys; } public String getPassword() { return this.user.getPwd(); } public String getUsername() { return this.user.getName(); } public boolean isAccountNonExpired() { return true; } public boolean isAccountNonLocked() { return true; } public boolean isCredentialsNonExpired() { return true; } public boolean isEnabled() { return this.user.getEnabled().equals("1") == true ? true : false; } }
1.3 创建 MyUserDetailsService
package zyk.security; import java.util.List; import org.hibernate.SessionFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.dao.DataAccessException; import org.springframework.orm.hibernate3.support.HibernateDaoSupport; import org.springframework.security.core.userdetails.UserDetails; import org.springframework.security.core.userdetails.UserDetailsService; import org.springframework.security.core.userdetails.UsernameNotFoundException; import org.springframework.stereotype.Component; import zyk.entity.User; /** * 用户信息管理类 * */ @Component("userDetailsService") public class MyUserDetailsService extends HibernateDaoSupport implements UserDetailsService { @Autowired public void init(SessionFactory sessionFactory) { super.setSessionFactory(sessionFactory); } //这里load用户信息 登录时进入这里. public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException, DataAccessException { String queryString = "from User u where u.name=?"; @SuppressWarnings("unchecked") List<User> users = this.getHibernateTemplate().find(queryString, username); if (users.size() == 0) { throw new UsernameNotFoundException("User " + username + "不存在!"); } User user = users.get(0); UserDetails userDetails = new MyUserDetails(user); return userDetails; } }
1.4 进行配置 (applicationContext.xml)和 (applicationContext-security.xml) 配置信息
已经贴到第7篇上面了 这是annotation 的实现方式 注释部分是XML 方式的配置.请参考.
这样就可以测试了 .
相关推荐
在"springsecurity学习笔记"中,你可能会涉及以下主题: - Spring Security的基本配置,包括web安全配置和全局安全配置。 - 如何自定义认证和授权流程,比如实现自定义的AuthenticationProvider和...
Spring Security是一个功能强大且高度可定制的身份验证和授权框架,专门用于保护Java应用程序的安全性。它构建在Spring Framework基础之上,提供了全面的安全解决方案,包括身份验证、授权、攻击防护等功能。 Spring...
SpringSecurity是Java开发中用于构建安全Web应用的框架,它提供了强大的身份验证、...在学习过程中,分析提供的源代码和示例将有助于深入理解SpringSecurity的工作原理,并能帮助你在实际项目中有效地应用这些知识。
spring security方面的学习资料,包含:Spring+Security+3+与+CAS单点登录配置;Spring+Security3中文教程;Spring-Security安全权限管理手册;Spring+Security文库;还有一个学习笔记!
Spring Security 是一个强大的安全框架,主要用于Java应用的安全管理,它为Web应用和企业级应用提供了全面的...通过学习这些文档,开发者可以更好地理解Spring Security的工作原理,从而更有效地实现应用的安全控制。
Spring Security的学习过程可以分为入门、进阶和高级三个阶段。入门阶段主要是了解Spring Security的基本概念和配置方法。进阶阶段需要深入学习如何定制认证和授权流程、如何集成各种认证方式以及如何在实际项目中...
"springsecurity-namespace"可能指的是Spring Security的XML命名空间配置。在Spring Security的早期版本中,使用XML配置是最常见的实践。例如,你可能会看到以下片段: ```xml **" access="hasRole('ROLE_ADMIN')...
首先,Spring_Security-3.0.1_中文官方文档(翻译版).pdf是学习SpringSecurity的重要资源,它包含详细的框架介绍、配置指南和使用示例。这份文档会帮助我们理解SpringSecurity的基础架构,如安全上下文、过滤器链和...
Spring Security 是一个强大的安全框架,用于为Java应用提供身份验证和授权服务。在这个完整的项目实例中...通过学习和实践这个项目,开发者能够深入理解Spring Security的工作原理,从而更有效地保护自己的Java应用。
SpringSecurity是Java领域中一款强大的安全框架,主要用于Web应用程序的安全管理。它提供了全面的身份验证、授权、会话...通过深入学习和实践,我们可以更好地掌握SpringSecurity,为我们的应用构建坚固的安全防线。
Spring Security 3是中国社区翻译的官方文档,为国内开发者提供了方便的学习资源。 本套文档包含了Spring Security的基础概念、配置、核心组件以及实际应用场景的详细讲解。以下是一些关键知识点的概述: 1. **...
Spring Security 是一个强大的安全框架,用于为Java应用提供全面的安全管理解决方案。它是Spring生态系统的组成部分,...无论你是初学者还是经验丰富的开发者,官方文档都是学习和掌握Spring Security不可或缺的资源。
在IT安全领域,Apache Shiro和Spring Security是两个非常重要的框架,它们主要用于应用程序的安全管理,包括身份验证、授权、会话管理和加密等。本学习文档集合了这两个框架的相关知识,旨在帮助开发者深入理解和...
- `spring-security-core-4.0.0.CI-SNAPSHOT-sources.jar`:提供源代码,便于深入学习和调试。 - `spring-security-core-4.0.0.CI-SNAPSHOT.jar`:核心模块的主要库,包括安全性元数据、认证、授权和访问决策管理...
《Spring Security 3.1 学习指南及资源解析》 Spring Security是Java平台上的一款强大且高度可定制的安全框架,广泛应用于企业级Web应用的安全管理。本篇文章将围绕"Spring Security 3.1"这一主题,深入探讨其核心...
Spring Security OAuth2.0学习笔记 什么是认证、授权、会话。 Java Servlet为支持http会话做了哪些事儿。 基于session认证机制的运作流程。 基于token认证机制的运作流程。 理解Spring Security的工作原理,Spring ...
【Spring Security 学习总结】 Spring Security 是一个强大的和高度可定制的身份验证和访问控制框架,用于保护基于 Java 的应用程序。本学习总结文档主要针对初学者,旨在剖析一个不安全的应用程序并阐述如何通过 ...
8. **自定义逻辑**:Spring Security允许开发者自定义几乎所有的安全逻辑,包括身份验证、授权和异常处理。这提供了极大的灵活性,可以根据项目需求进行扩展。 9. **RESTful安全**:3.1版本也支持保护RESTful服务,...