`
qq543123909
  • 浏览: 25862 次
社区版块
存档分类
最新评论

Spring Security 学习(8)

阅读更多

这篇主要的内容是 

通过自定义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学习笔记

    在"springsecurity学习笔记"中,你可能会涉及以下主题: - Spring Security的基本配置,包括web安全配置和全局安全配置。 - 如何自定义认证和授权流程,比如实现自定义的AuthenticationProvider和...

    最详细Spring Security学习资料(源码)

    Spring Security是一个功能强大且高度可定制的身份验证和授权框架,专门用于保护Java应用程序的安全性。它构建在Spring Framework基础之上,提供了全面的安全解决方案,包括身份验证、授权、攻击防护等功能。 Spring...

    SpringSecurity学习总结源代码

    SpringSecurity是Java开发中用于构建安全Web应用的框架,它提供了强大的身份验证、...在学习过程中,分析提供的源代码和示例将有助于深入理解SpringSecurity的工作原理,并能帮助你在实际项目中有效地应用这些知识。

    spring security学习资料

    spring security方面的学习资料,包含:Spring+Security+3+与+CAS单点登录配置;Spring+Security3中文教程;Spring-Security安全权限管理手册;Spring+Security文库;还有一个学习笔记!

    Spring Security 资料合集

    Spring Security 是一个强大的安全框架,主要用于Java应用的安全管理,它为Web应用和企业级应用提供了全面的...通过学习这些文档,开发者可以更好地理解Spring Security的工作原理,从而更有效地实现应用的安全控制。

    SpringSecurity.pdf

    Spring Security的学习过程可以分为入门、进阶和高级三个阶段。入门阶段主要是了解Spring Security的基本概念和配置方法。进阶阶段需要深入学习如何定制认证和授权流程、如何集成各种认证方式以及如何在实际项目中...

    Spring Security 学习总结1_3

    "springsecurity-namespace"可能指的是Spring Security的XML命名空间配置。在Spring Security的早期版本中,使用XML配置是最常见的实践。例如,你可能会看到以下片段: ```xml **" access="hasRole('ROLE_ADMIN')...

    SpringSecurity学习

    首先,Spring_Security-3.0.1_中文官方文档(翻译版).pdf是学习SpringSecurity的重要资源,它包含详细的框架介绍、配置指南和使用示例。这份文档会帮助我们理解SpringSecurity的基础架构,如安全上下文、过滤器链和...

    spring security 完整项目实例

    Spring Security 是一个强大的安全框架,用于为Java应用提供身份验证和授权服务。在这个完整的项目实例中...通过学习和实践这个项目,开发者能够深入理解Spring Security的工作原理,从而更有效地保护自己的Java应用。

    SpringSecurity笔记,编程不良人笔记

    SpringSecurity是Java领域中一款强大的安全框架,主要用于Web应用程序的安全管理。它提供了全面的身份验证、授权、会话...通过深入学习和实践,我们可以更好地掌握SpringSecurity,为我们的应用构建坚固的安全防线。

    Spring Security-3中文官方文档(及教程)

    Spring Security 3是中国社区翻译的官方文档,为国内开发者提供了方便的学习资源。 本套文档包含了Spring Security的基础概念、配置、核心组件以及实际应用场景的详细讲解。以下是一些关键知识点的概述: 1. **...

    spring security 官方文档

    Spring Security 是一个强大的安全框架,用于为Java应用提供全面的安全管理解决方案。它是Spring生态系统的组成部分,...无论你是初学者还是经验丰富的开发者,官方文档都是学习和掌握Spring Security不可或缺的资源。

    Shiro+Spring Security学习文档

    在IT安全领域,Apache Shiro和Spring Security是两个非常重要的框架,它们主要用于应用程序的安全管理,包括身份验证、授权、会话管理和加密等。本学习文档集合了这两个框架的相关知识,旨在帮助开发者深入理解和...

    spring security 4.0.0所需jar包

    - `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 3.1 学习指南及资源解析》 Spring Security是Java平台上的一款强大且高度可定制的安全框架,广泛应用于企业级Web应用的安全管理。本篇文章将围绕"Spring Security 3.1"这一主题,深入探讨其核心...

    Spring Security OAuth2.0学习笔记.zip

    Spring Security OAuth2.0学习笔记 什么是认证、授权、会话。 Java Servlet为支持http会话做了哪些事儿。 基于session认证机制的运作流程。 基于token认证机制的运作流程。 理解Spring Security的工作原理,Spring ...

    spring security 学习总结文档

    【Spring Security 学习总结】 Spring Security 是一个强大的和高度可定制的身份验证和访问控制框架,用于保护基于 Java 的应用程序。本学习总结文档主要针对初学者,旨在剖析一个不安全的应用程序并阐述如何通过 ...

    spring_security_3.1

    8. **自定义逻辑**:Spring Security允许开发者自定义几乎所有的安全逻辑,包括身份验证、授权和异常处理。这提供了极大的灵活性,可以根据项目需求进行扩展。 9. **RESTful安全**:3.1版本也支持保护RESTful服务,...

Global site tag (gtag.js) - Google Analytics