`
laodaobazi
  • 浏览: 275660 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Spring Security自定义数据表完整实现

阅读更多

创建MySQL数据表的语句:

SET FOREIGN_KEY_CHECKS=0;
	------------------------------
	-- 创建管理员帐号表t_admin
	-- ----------------------------
	CREATE TABLE `t_admin` (
	  `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
	  `passwd` varchar(12) NOT NULL DEFAULT '' COMMENT '用户密码',
	  `nickname` varchar(20) NOT NULL DEFAULT '' COMMENT '用户名字',
	  `phoneno` varchar(32) NOT NULL DEFAULT '' COMMENT '电话号码',
	  PRIMARY KEY (`id`)
	) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8;

	-- ----------------------------
	-- 添加3个管理帐号 
	-- ----------------------------
	INSERT INTO `t_admin` VALUES ('1', 'admin', 'admin', '');
	INSERT INTO `t_admin` VALUES ('4', '123456', 'test', '');
	INSERT INTO `t_admin` VALUES ('5', '111111', '111111', '');
	
	-- ----------------------------
	-- 创建权限表t_role
	-- ----------------------------
	CREATE TABLE `t_role` (
	  `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
	  `role` varchar(40) NOT NULL DEFAULT '',
	  `descpt` varchar(40) NOT NULL DEFAULT '' COMMENT '角色描述',
	  `category` varchar(40) NOT NULL DEFAULT '' COMMENT '分类',
	  PRIMARY KEY (`id`)
	) ENGINE=InnoDB AUTO_INCREMENT=60 DEFAULT CHARSET=utf8;

	-- ----------------------------
	-- 加入4个操作权限
	-- ----------------------------
	INSERT INTO `t_role` VALUES ('1', 'ROLE_ADMIN', '系统管理员', '系统管理员');
	INSERT INTO `t_role` VALUES ('2', 'ROLE_UPDATE_FILM', '修改', '影片管理');
	INSERT INTO `t_role` VALUES ('3', 'ROLE_DELETE_FILM', '删除', '影片管理');
	INSERT INTO `t_role` VALUES ('4', 'ROLE_ADD_FILM', '添加', '影片管理');

	-- ----------------------------
	-- 创建权限组表
	-- ----------------------------
	CREATE TABLE `t_group` (
	  `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
	  `groupname` varchar(50) NOT NULL DEFAULT '',
	  PRIMARY KEY (`id`)
	) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8;

	-- ----------------------------
	-- 添加2个权限组
	-- ----------------------------
	INSERT INTO `t_group` VALUES ('1', 'Administrator');
	INSERT INTO `t_group` VALUES ('2', '影片维护');

	-- ----------------------------
	-- 创建权限组对应权限表t_group_role
	-- ----------------------------
	CREATE TABLE `t_group_role` (
	  `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
	  `groupid` bigint(20) unsigned NOT NULL,
	  `roleid` bigint(20) unsigned NOT NULL,
	  PRIMARY KEY (`id`),
	  UNIQUE KEY `groupid2` (`groupid`,`roleid`),
	  KEY `roleid` (`roleid`),
	  CONSTRAINT `t_group_role_ibfk_1` FOREIGN KEY (`groupid`) REFERENCES `t_group` (`id`),
	  CONSTRAINT `t_group_role_ibfk_2` FOREIGN KEY (`roleid`) REFERENCES `t_role` (`id`)
	) ENGINE=InnoDB AUTO_INCREMENT=83 DEFAULT CHARSET=utf8;

	-- ----------------------------
	-- 加入权限组与权限的对应关系
	-- ----------------------------
	INSERT INTO `t_group_role` VALUES ('1', '1', '1');
	INSERT INTO `t_group_role` VALUES ('2', '2', '2');
	INSERT INTO `t_group_role` VALUES ('4', '2', '4');

	-- ----------------------------
	-- 创建管理员所属权限组表t_group_user
	-- ----------------------------
	CREATE TABLE `t_group_user` (
	  `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
	  `userid` bigint(20) unsigned NOT NULL,
	  `groupid` bigint(20) unsigned NOT NULL,
	  PRIMARY KEY (`id`),
	  KEY `userid` (`userid`),
	  KEY `groupid` (`groupid`),
	  CONSTRAINT `t_group_user_ibfk_2` FOREIGN KEY (`groupid`) REFERENCES `t_group` (`id`),
	  CONSTRAINT `t_group_user_ibfk_3` FOREIGN KEY (`userid`) REFERENCES `t_admin` (`id`)
	) ENGINE=InnoDB AUTO_INCREMENT=18 DEFAULT CHARSET=utf8;

	-- ----------------------------
	-- 将管理员加入权限组
	-- ----------------------------
	INSERT INTO `t_group_user` VALUES ('1', '1', '1');
	INSERT INTO `t_group_user` VALUES ('2', '4', '2');

	-- ----------------------------
	-- 创建管理员对应权限表t_user_role
	-- 设置该表可跳过权限组,为管理员直接分配权限
	-- ----------------------------
	CREATE TABLE `t_user_role` (
	  `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
	  `userid` bigint(20) unsigned NOT NULL,
	  `roleid` bigint(20) unsigned NOT NULL,
	  PRIMARY KEY (`id`),
	  KEY `userid` (`userid`),
	  KEY `roleid` (`roleid`),
	  CONSTRAINT `t_user_role_ibfk_1` FOREIGN KEY (`userid`) REFERENCES `t_admin` (`id`),
	  CONSTRAINT `t_user_role_ibfk_2` FOREIGN KEY (`roleid`) REFERENCES `t_role` (`id`)
	) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8;
	

 

 

配置文件applicationContext-security.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans:beans xmlns="http://www.springframework.org/schema/security"
	xmlns:b="http://www.springframework.org/schema/beans" 
	xmlns:beans="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://www.springframework.org/schema/beans 
								http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
                        		http://www.springframework.org/schema/security 
                        		http://www.springframework.org/schema/security/spring-security-3.0.xsd">

	<http >
		<!-- 不拦截login.jsp -->
		<intercept-url pattern="/login.jsp*" access="IS_AUTHENTICATED_ANONYMOUSLY" />
		<!--仅拦截到manager下面的内容,具备access对应权限的-->
		<intercept-url pattern="/manager/**" access="ROLE_ADMIN,ROLE_UPDATE_FILM,ROLE_DELETE_FILM,ROLE_ADD_FILM" />
		<!-- 登录表单设置 -->
		<form-login login-page="/login.jsp"
			default-target-url="/manager/films.jsp"
			authentication-failure-url="/login.jsp?error=true" />
		
		<!-- 登出操作后跳转到该页面 -->
		<logout logout-success-url="/loggedout.jsp"/>
		<remember-me />
		
		<!-- SESSION超时后跳转到该页面 -->
		<session-management invalid-session-url="/timeout.jsp">
		</session-management>
	</http>
	
	<authentication-manager alias="authenticationManager">
		<authentication-provider>
			<!-- 
				直接使用SQL语句查询登录帐号对应权限,
				users-by-username-query:查询登录用户是否存在
				authorities-by-username-query:查询登录用户权限(登录用户可以不属于任何组,从t_user_role表中获取权限)
				group-authorities-by-username-query:查询登录用户所在组的权限
			-->
			<jdbc-user-service data-source-ref="dataSource"
			group-authorities-by-username-query="SELECT g.id,g.groupname,role.role
							 FROM t_group AS g 
							 LEFT OUTER JOIN t_group_role AS grouprole ON (g.id = grouprole.groupid)
							 LEFT OUTER JOIN t_role AS role ON (role.id = grouprole.roleid)
							 LEFT OUTER JOIN t_group_user AS groupuser on (g.id = groupuser.groupid)
							 LEFT OUTER JOIN t_admin ON (t_admin.id = groupuser.userid)
							 WHERE t_admin.nickname = ?"
				users-by-username-query="SELECT t_admin.nickname AS username,t_admin.passwd as password,'true' AS enabled
							 FROM t_admin
							 WHERE t_admin.nickname = ?"
				authorities-by-username-query="SELECT t_admin.nickname AS username,role.role as authorities
							   FROM t_admin 
							   LEFT OUTER JOIN t_user_role AS userrole ON(t_admin.id = userrole.userid)
							   LEFT OUTER JOIN t_role AS role ON (userrole.roleid = role.id)
							   WHERE t_admin.nickname = ?" />
		</authentication-provider>
	</authentication-manager>
	
	<!-- 自定义消息 -->
	<b:bean id="messageSource" class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
		<b:property name="basename" value="classpath:org/springframework/security/messages" />
	</b:bean>
	
	<beans:bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"	destroy-method="close">
		<b:property name="driverClass">
			<b:value>com.mysql.jdbc.Driver</b:value>
		</b:property>
		<b:property name="jdbcUrl">
			<b:value>jdbc:mysql://localhost:3306/security</b:value>			
		</b:property>
		<b:property name="user">
			<b:value>root</b:value>
		</b:property>
		<b:property name="password">
			<b:value>root</b:value>
		</b:property>
		<b:property name="initialPoolSize">
			<b:value>10</b:value>
		</b:property>
		<b:property name="minPoolSize">
			<b:value>5</b:value>
		</b:property>
		<b:property name="maxPoolSize">
			<b:value>30</b:value>
		</b:property>
		<b:property name="acquireIncrement">
			<b:value>5</b:value>
		</b:property>
		<b:property name="maxIdleTime">
			<b:value>10</b:value>
		</b:property>
		<b:property name="maxStatements">
			<b:value>0</b:value>
		</b:property>
	</beans:bean>
	
</beans:beans>

 

 

值得注意的是:

<authentication-provider>
		<!-- 
			直接使用SQL语句查询登录帐号对应权限,
			users-by-username-query:查询登录用户是否存在
			authorities-by-username-query:查询登录用户权限(登录用户可以不属于任何组,从t_user_role表中获取权限)
			group-authorities-by-username-query:查询登录用户所在组的权限
		-->
	<jdbc-user-service data-source-ref="dataSource"
		group-authorities-by-username-query="SELECT g.id,g.groupname,role.role
				FROM t_group AS g 
				LEFT OUTER JOIN t_group_role AS grouprole ON (g.id = grouprole.groupid)
				LEFT OUTER JOIN t_role AS role ON (role.id = grouprole.roleid)
				LEFT OUTER JOIN t_group_user AS groupuser on (g.id = groupuser.groupid)
				LEFT OUTER JOIN t_admin ON (t_admin.id = groupuser.userid)
				WHERE t_admin.nickname = ?"
		users-by-username-query="SELECT t_admin.nickname AS username,t_admin.passwd as password,'true' AS enabled
				FROM t_admin
				WHERE t_admin.nickname = ?"
		authorities-by-username-query="SELECT t_admin.nickname AS username,role.role as authorities
				FROM t_admin 
				LEFT OUTER JOIN t_user_role AS userrole ON(t_admin.id = userrole.userid)
				LEFT OUTER JOIN t_role AS role ON (userrole.roleid = role.id)
				WHERE t_admin.nickname = ?" />
</authentication-provider>

 通过user的用户名进行登录,并且去查询该用户所拥有的权限。

 

films.jsp页面

<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8" %>
<%@ taglib prefix="security" uri="http://www.springframework.org/security/tags"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <title>权限操作</title>
  </head>
  <body>
    <security:authorize ifAnyGranted="ROLE_ADMIN,ROLE_ADD_FILM">
		登录帐号具备ROLE_ADMIN权限或者ROLE_ADD_FILM权限可显示
    </security:authorize>
    <br/>
	<security:authorize ifAnyGranted="ROLE_ADMIN,ROLE_UPDATE_FILM">
		登录帐号具备ROLE_ADMIN权限或者ROLE_UPDATE_FILM权限可显示
	</security:authorize>
	<br/>
   	<security:authorize ifAnyGranted="ROLE_ADMIN,ROLE_DELETE_FILM">
    	登录帐号具备ROLE_ADMIN权限或者ROLE_DELETE_FILM权限可显示
   	</security:authorize>
  </body>
</html>

 

分享到:
评论

相关推荐

    Spring security 自定义密码加密方式的使用范例。

    在提供的压缩包文件"ALLSRC"中,你应该能找到一个完整的Spring Security项目,包括源代码、配置文件和依赖。通过这个项目,你可以深入理解Spring Security的工作原理,并学习如何自定义其核心组件。如果你对码云不...

    spring-security实现自定义登录认证.rar

    本资源“spring-security实现自定义登录认证.rar”包含了一个使用Spring Security进行登录认证的示例,以及JWT(JSON Web Tokens)与Spring Security集成的代码。 首先,让我们了解Spring Security的基本工作原理。...

    spring security 4 小例子带自定义过滤器

    在Spring Security 4中,我们可以通过自定义过滤器来扩展其功能,以满足特定的安全需求。在这个小例子中,我们将探讨如何创建并集成自定义过滤器,以及它在Spring Security中的工作原理。 首先,我们需要理解Spring...

    spring security 完整项目实例

    在Spring Security中,用户信息通常存储在一个持久化的数据源中,如数据库。通过UserDetailsService接口,我们可以自定义实现来加载用户信息。用户与角色之间的关系通常通过用户角色表来建立,而角色则赋予了用户...

    spring security的学习-3. 自定义数据库表结构.doc

    自定义数据库表结构”的文档中,我们将探讨如何根据企业特定的需求来定制Spring Security的数据库表结构,并且如何初始化数据以及获取自定义的用户权限信息。Spring Security默认的表结构可能无法满足所有企业的...

    SpringSecurity 之自定义用户权限信息的存取

    本文将详细探讨SpringSecurity中关于自定义用户权限信息存取的实现方法,包括如何通过配置文件和数据库来管理用户的认证信息和权限数据。 首先,当我们谈论用户权限信息的存取,实际上是在处理两个方面的问题:用户...

    自定义Spring Security的身份验证失败处理方法

    自定义Spring Security的身份验证失败处理方法 在 Spring Security 中,身份验证失败处理方法是一个非常重要的组件,它能够帮助我们处理身份验证失败的情况。然而,默认的身份验证失败处理方法并不总是能够满足我们...

    springsecurity(用spring ibatis freemaker 用户自定义)实现的权限管理页面

    springsecurity(用spring ibatis freemaker)实现的用户自定义的权限管理页面, 里头包括数据库脚本 和原数据 和原代码 主要参考http://blog.csdn.net/k10509806/article/details/6369131 这个人的文章做的

    spring security权限管理开发手册及实例.rar

    - **springsecurity-sample**:这个示例项目可能包含了从创建用户、角色到实现登录、权限控制的完整流程。你可以通过它学习如何配置Spring Security XML或Java配置,如何编写自定义的认证和授权逻辑,以及如何在...

    springsecurity+oauth2+jwt实现单点登录demo

    该资源是springsecurity+oauth2+jwt实现的单点登录demo,模式为授权码模式,实现自定义登录页面和自定义授权页面。应用数据存在内存中或者存在数据库中(附带数据库表结构),token存储分为数据库或者Redis。demo...

    springboot springsecurity动态权限控制

    在这个“springboot springsecurity动态权限控制”的主题中,我们将深入探讨如何在Spring Boot项目中集成Spring Security,实现动态权限控制,让菜单权限的管理更加灵活和高效。 首先,我们需要理解Spring Security...

    Spring Security 完整实例

    例如,可以创建一个名为`CustomUserDetailsService`的类,它连接到自定义的用户和角色表,查询用户信息,并将其转换为Spring Security的`UserDetails`对象。 **自定义登录页面** 默认的Spring Security登录页面是...

    Spring Security自定义登录原理及实现详解

    在本文中,我们将深入探讨Spring Security的自定义登录原理和实现,这对于理解和构建安全的Web应用程序至关重要。Spring Security是一个强大的安全框架,提供了丰富的功能来保护我们的应用程序,包括用户认证、授权...

    SpringSecurity笔记,编程不良人笔记

    在`SpringSecurity.md`和`SpringSecurity.pdf`文档中,可能包含SpringSecurity配置、自定义用户服务、授权策略等方面的代码示例。`codes`目录可能包含实际运行的项目代码,方便读者实践和理解。 8. **图笔记.draw...

    IDEA+SpringBoot+SpringSecurity:整个SpringSecurity的实现过程,可应用于线上产品

    本教程将基于IntelliJ IDEA(IDEA)和SpringBoot来详细介绍如何实现SpringSecurity,并将其应用到线上产品中。 首先,我们需要在SpringBoot项目中引入SpringSecurity依赖。在`build.gradle`或`pom.xml`文件中添加...

    Spring Security 把授权信息写入数据库

    目标是将现有的Acegi配置迁移到Spring Security 2.0,同时保持使用数据库作为认证和授权数据源的能力,避免依赖XML配置文件。 24.3. 实现步骤 要实现这一目标,首先需要将Spring Security 2.0的库文件添加到项目的...

    微信扫一扫登录、微信支付、springsecurity&oauth2

    项目中使用到的技术包含SpringBoot、SpringSecurity&oauth2(安全资源和授权中心模式、包括登录接口自定义返回字段、自定义手机号+密码登录、自定义免密登录)、Queue队列、线程池、xss攻击配置、SpringCache、Mybatis...

    Spring Security UserDetails实现原理详解

    Spring Security 是一个强大的安全框架,用于管理Web应用的认证和授权。在Spring Security中,`UserDetails` 是一个核心概念,它代表了系统的用户信息。本文将深入探讨`UserDetails`的实现原理,并通过示例代码进行...

Global site tag (gtag.js) - Google Analytics