`
snoopy7713
  • 浏览: 1127066 次
  • 性别: Icon_minigender_2
  • 来自: 火星郊区
博客专栏
Group-logo
OSGi
浏览量:0
社区版块
存档分类
最新评论

spring security3进级篇II

阅读更多

本篇文章用户和权限用数据库存储,而资源(url)和权限的对应采用硬编码配置在XML中实现的。

在本篇中需要把用户和权限信息存到数据库中,本例子采用mysql数据库,数据库表如下:

 

Sql代码  收藏代码
  1. CREATE   TABLE  users(  
  2.     username VARCHAR (50)  NOT   NULL ,  
  3.     password   VARCHAR (50)  NOT   NULL ,  
  4.     enabled BOOLEAN NOT   NULL ,  
  5.     PRIMARY   KEY  (username)  
  6. )ENGINE=InnoDB DEFAULT  CHARSET=utf8;  
  7.   
  8.   
  9. CREATE   TABLE  authorities (  
  10. username VARCHAR (50)  NOT   null ,  
  11. authority VARCHAR (50)  NOT   null ,  
  12. CONSTRAINT  fk_authorities_users  FOREIGN   KEY (username)  REFERENCES  users(username)  
  13. )ENGINE=InnoDB DEFAULT  CHARSET=utf8;  
  14.   
  15. CREATE   UNIQUE   INDEX  ix_auth_username  ON  authorities (username,authority);  
  16.   
  17. INSERT   INTO  users(username, password ,enabled)  values ( 'admin' , '21232f297a57a5a743894a0e4a801fc3' ,1);  
  18. INSERT   INTO  users(username, password ,enabled)  values ( 'user' , 'ee11cbb19052e40b07aac0ca060c23ee' ,1);  
  19. INSERT   INTO  authorities  VALUES ( 'admin' , 'ROLE_ADMIN' );  
  20. INSERT   INTO  authorities  VALUES ( 'user' , 'ROLE_USER' );  

 创建名字为sping_security数据库,同时为该工程配置数据库信息,本例子采用了连接池的方式C30,配置如下:

Java代码  收藏代码
  1. <?xml version= "1.0"  encoding= "UTF-8" ?>  
  2. <beans xmlns="http://www.springframework.org/schema/beans"   
  3.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  xmlns:aop= "http://www.springframework.org/schema/aop"   
  4.     xmlns:tx="http://www.springframework.org/schema/tx"  xmlns:context= "http://www.springframework.org/schema/context"   
  5.     xmlns:jee="http://www.springframework.org/schema/jee"   
  6.     xmlns:p="http://www.springframework.org/schema/p"    
  7.     xsi:schemaLocation="  
  8.     http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd   
  9.     http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd   
  10.     http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd   
  11.     http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd   
  12.     http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee.xsd">   
  13.     <description>dataSource配置</description>  
  14.     <!-- 指定数据库配置文件地址. -->  
  15.     <context:property-placeholder location="classpath*:datasource/jdbc.properties" />  
  16.       
  17.     <!-- 定义数据源Bean,使用C3P0连接池数据源实现 -->  
  18.     <bean name="spring_security_dataSource"  id= "spring_security_dataSource"   class = "com.mchange.v2.c3p0.ComboPooledDataSource"   
  19.         destroy-method="close" >  
  20.         <!-- 指定连接数据库的驱动 -->  
  21.         <property name="driverClass"  value= "${jdbc.driverClassName}"  />  
  22.         <!-- 指定连接数据库的URL -->  
  23.         <property name="jdbcUrl"  value= "${jdbc.url}"  />  
  24.         <!-- 指定连接数据库的用户名 -->  
  25.         <property name="user"  value= "${jdbc.username}"  />  
  26.         <!-- 指定连接数据库的密码 -->  
  27.         <property name="password"  value= "${jdbc.password}"  />  
  28.         <!-- C3p0连接池的配置信息 -->  
  29.         <!-- 指定连接池中保留的最大连接数. Default:15  -->  
  30.         <property name="maxPoolSize"  value= "${cpool.maxPoolSize}"  />  
  31.         <!-- 指定连接池中保留的最小连接数 -->  
  32.         <property name="minPoolSize"  value= "${cpool.minPoolSize}"  />  
  33.         <!-- 指定连接池的初始化连接数 取值应在minPoolSize 与 maxPoolSize 之间.Default:3  -->  
  34.         <property name="initialPoolSize"  value= "${cpool.initialPoolSize}"  />  
  35.         <!-- 最大空闲时间,60 秒内未使用则连接被丢弃。若为 0 则永不丢弃。 Default: 0  -->  
  36.         <property name="maxIdleTime"  value= "${cpool.maxIdleTime}"  />  
  37.         <!-- 当连接池中的连接耗尽的时候c3p0一次同时获取的连接数. Default:3  -->  
  38.         <property name="acquireIncrement"  value= "${cpool.acquireIncrement}"  />  
  39.         <!--JDBC 的标准,用以控制数据源内加载的PreparedStatements数量。但由于预缓存的statements属于单个connection而不是整个 连接池所以设置这个参数需要考虑到多方面的因数.如果maxStatements与maxStatementsPerConnection均为0 ,则缓存被关闭。Default: 0  -->  
  40.         <property name="maxStatements"  value= "${cpool.maxStatements}"  />  
  41.         <!-- 每60 秒检查所有连接池中的空闲连接.Default: 0  -->  
  42.         <property name="idleConnectionTestPeriod"  value= "${cpool.idleConnectionTestPeriod}"  />  
  43.         <!-- 定义在从数据库获取新连接失败后重复尝试的次数。 Default:30  -->  
  44.         <property name="acquireRetryAttempts"  value= "${cpool.acquireRetryAttempts}"  />  
  45.         <!--获取连接失败将会引起所有等待连接池来获取连接的线程抛出异常。但是数据源仍有效保留,并在下次调用getConnection()的时候继续尝试获取连接。如果设为true ,那么在尝试获取连接失败后该数据源将申明已断开并永久关闭。Default: false  -->  
  46.         <property name="breakAfterAcquireFailure"  value= "${cpool.breakAfterAcquireFailure}"  />  
  47.         <!--跟性能消耗大请只在需要的时候是哟个它。如果设为true ,那么在每个connection提交的时候都将校验其有效性。建议使用idleConnectionTestPeriod或automaticTestTable等提升连接测试的性能。Default: false  -->  
  48.         <property name="testConnectionOnCheckout"  value= "${cpool.testConnectionOnCheckout}"  />  
  49.         <!--连接关闭时默认将所有未提交的操作回滚。Default: false  -->  
  50.         <property name="autoCommitOnClose"  value= "${cpool.autoCommitOnClose}"  />  
  51.         <!--当连接池用完时客户端调用getConnection()后等待获取新连接的时间,超时后将抛出 SQLException,如设为0 则无限期等待。单位毫秒。Default: 0  -->  
  52.         <property name="checkoutTimeout"  value= "${cpool.checkoutTimeout}"  />  
  53.         <!--c3p0将建一张名为Test的空表,并使用其自带的查询语句进行测试。如果定义了这个参数那么属性preferredTestQuery将被忽略。你不能在这张Test表上进行任何操作,它将只供c3p0测试使用。Default:   
  54.             null  -->  
  55.         <property name="automaticTestTable"  value= "${cpool.automaticTestTable}"  />  
  56.     </bean>   
  57. </beans>  

 jdbc properties

Xml代码  收藏代码
  1. # 数据库配置信息  
  2. jdbc.driverClassName = com .mysql.jdbc.Driver  
  3. jdbc jdbc.url =jdbc:mysql://localhost:3306/spring_security? useUnicode = true & characterEncoding = UTF -8& autoReconnect = true   
  4. jdbc.username = root   
  5. jdbc.password = root   
  6.   
  7.   
  8. # 数据库连接池信息配置  
  9.   
  10. # Connection pool size  
  11. cpool.maxPoolSize = 25   
  12. cpool.minPoolSize = 10   
  13. cpool.initialPoolSize = 15   
  14.   
  15. # How long to keep unused connections around(in seconds)  
  16. # Note: MySQL times out idle connections after 8 hours(28,800 seconds)  
  17. # so ensure this value is below MySQL idle timeout  
  18. cpool.maxIdleTime = 7200   
  19.   
  20. # Acquiring new connections is slow, so eagerly retrieve extra connections  
  21. # when current pool size is reached  
  22. cpool.acquireIncrement = 5   
  23.   
  24. cpool.maxStatements = 0   
  25. cpool.idleConnectionTestPeriod = 60   
  26. cpool.acquireRetryAttempts = 30   
  27. cpool.breakAfterAcquireFailure = true   
  28. cpool.testConnectionOnCheckout = false   
  29. cpool.autoCommitOnClose = true   
  30.   
  31. # Time to wait for an open connection before timing out  
  32. # (in milliseconds)  
  33. cpool.checkoutTimeout = 5000   
  34. cpool.automaticTestTable = test   

 针对权限问题,我们建立了如下的几个页面,用于验证不同权限问题

(1) admin.jsp页面,只允许admin访问。

Java代码  收藏代码
  1. <%@ page language= "java"  contentType= "text/html; charset=UTF-8"   
  2.     pageEncoding="UTF-8" %>  
  3. <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"   "http://www.w3.org/TR/html4/loose.dtd" >  
  4. <html>  
  5. <head>  
  6. <meta http-equiv="Content-Type"  content= "text/html; charset=UTF-8" >  
  7. <title>管理员页面</title>  
  8. </head>  
  9. <body>  
  10.     欢迎管理员  
  11. </body>  
  12. </html>  

 (2) 页面无权限时403页面,该页面用于显示无权限的页面accessDefined

Html代码  收藏代码
  1. < %@ page  language = "java"   contentType = "text/html; charset=UTF-8"   
  2.     pageEncoding = "UTF-8" % >   
  3. <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">   
  4. < html >   
  5. < head >   
  6. < meta   http-equiv = "Content-Type"   content = "text/html; charset=UTF-8" >   
  7. < title > 无权访问 </ title >   
  8. </ head >   
  9. < body >   
  10.     你的访问被拒绝,无权访问该资源!  
  11. </ body >   
  12. </ html >   

 (3)在index页面显示用户,注意在页面显示用户信息的时候我们采用了spring security的特殊标签,如果想在java代码中获取用户的信息,采用如下的方式:



 同时,我们添加了用户退出按钮,代码如下:

 

Html代码  收藏代码
  1. < %@ page  language = "java"   contentType = "text/html; charset=UTF-8"   
  2.     pageEncoding = "UTF-8" % >   
  3. < %@taglib  prefix = "sec"   uri = "http://www.springframework.org/security/tags" % >   
  4. < %@taglib  prefix = "c"   uri = "http://java.sun.com/jstl/core" % >   
  5. <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">   
  6. < html >   
  7. < head >   
  8. < meta   http-equiv = "Content-Type"   content = "text/html; charset=UTF-8" >   
  9. < title > 首页 </ title >   
  10. </ head >   
  11. < body >   
  12.     < h1 > 这里是首页, < sec:authentication   property = "name" /> ! </ h1 >   
  13.     < %   
  14.         String[] str  =  session .getValueNames();  
  15.         for(int i = 0 ;i < str.length ;i++){  
  16.             out.println("key =="+str[i]);  
  17.             out.println("value =="+session.getAttribute(str[i]));  
  18.         }  
  19.     %>   
  20.     < br />   
  21.     < a   href = "admin.jsp" > 进入admin.jsp </ a >   
  22.     <!-- 页面退出的时候 应用spring security的固定url地址-->   
  23.     < br />   
  24.     < a   href = "${pageContext.request.contextPath}/j_spring_security_logout"   /> Logout </ a >    
  25. </ body >   
  26. </ html >   

 

工程结构如下:

 



 (3)部署,我们首先验证权限问题,当admin进入时页面直接显示admin的名字,同时我们访问”进入adim.jsp“,界面过程如下:

 



 

 (4)更换user用户登录,访问admin页面时,界面过程如下:

 



 

 (5) 验证下退出后的情况,当我们点击退出时,直接返回登录界面,点击浏览器后退按钮,返回到原先的界面,点击链接,此时又返回到登录界面,说明退出按钮的session被清空,起作用了。

 

关于权限的控制,spring security提供了标签,直接控制菜单的显示与否,标签用法如下:

 

<sec:authorize ifAllGranted="ROLE_ADMIN" >
<a href="admin.jsp">进入admin.jsp页面</a>
</sec:authorize>

 

sec:authorize 标签的属性:
A) ifAllGranted:只有当前用户拥有所有指定的权限时,才能显示标签体的内容 (相当于“与” 的关系)
B) ifAnyGranted:当前用户拥有指定的权限中的一个的时候,就能显示标签内部内容(相当于“或”的关系)
C) ifNotGranted:没有指定的权限的时候,显示标签体的内容 (相当于“非”的关系)

 

或者可如下方式写

<sec:authorize url="/admin.jsp" >
<a href="admin.jsp">进入admin.jsp页面</a>
</sec:authorize>

分享到:
评论

相关推荐

    spring security进级篇 V 自定义标签控制显示

    NULL 博文链接:https://gaojiewyh.iteye.com/blog/1501470

    SpringBoot整合Spring Security.docx

    Spring Security是一个功能强大且高度可定制的身份验证和...这篇文章就是想通过一个小案例将Spring Security整合到SpringBoot中去。要实现的功能就是在认证服务器上登录,然后获取Token,再访问资源服务器中的资源。

    SpringCloud视频教程全套百度网盘

    第4章 SpringSecurity安全详细讲解及应用 第5章 RabbitMQ高级消息的讲解及应用 第6章 ElasticSearch详细讲解及应用 第7章 Eureka分布式服务器的搭建 。。。。。。。。。 第15章 SpringCloud项目实战 。。。。。。。...

    128元尚硅谷Java视频教程_Spring Boot视频教程(下)整合篇

    着重介绍SpringBoot的与各大场景的整合使用,内容包括:缓存(整合Redis),消息中间件(整合RabbitMQ),检索(整合ElasticSearch),任务(异步任务,定时任务,邮件任务),安全(整合SpringSecurity),分布式...

    spring-boot-demo:Spring Boot和Spring Cloud和Spring Security演示案例(Spring学习示例实战项目)

    SpringBoot + SpringCloud + SpringSecurity学习过程中的二进制汇总,沉淀记录下学习历程 1.知识点图谱 所有博文集中发布在个人博客网站: 大致规划的内容包括以下章节,希望能用半年到一年(严重超期)的时间完成....

    尚硅谷Java视频教程_Spring Boot视频教程(下)整合篇

    着重介绍SpringBoot的与各大场景的整合使用,内容包括:缓存(整合Redis),消息中间件(整合RabbitMQ),检索(整合ElasticSearch),任务(异步任务,定时任务,邮件任务),安全(整合SpringSecurity),...

    Java架构师之路系列教程

    3.高级篇-单点登录,Groovy视频,性能优化,Maven,Mongodb,Redis,Spring Security,Spring 源码,JVM,微信,银行接口等 4.架构篇-Linux视频,Nginx视频,京东海量订单处理视频,大型电商分布式实践,架构实战等 ...

    springCloud

    Spring Cloud包含了多个子项目(针对分布式系统中涉及的多个不同开源产品),比如:Spring Cloud Config、Spring Cloud Netflix、Spring Cloud0 CloudFoundry、Spring Cloud AWS、Spring Cloud Security、Spring ...

    尚硅谷SpringBoot视频全套(核心技术篇+整合篇)

    着重介绍SpringBoot的与各大场景的整合使用,内容包括:缓存(整合Redis),消息中间件(整合RabbitMQ),检索(整合ElasticSearch),任务(异步任务,定时任务,邮件任务),安全(整合SpringSecurity),分布式...

    X-SpringBoot:X-SpringBoot是一个轻量级的Java快速开发平台,能快速开发项目并交付【接私活利器】

    上载lombok大量简化了代码上一篇MyBatis Plus大量简化了SQL约会hutool工具包规范工具类♡minio分布式文件系统前一级完全脱离,前端代码可单独部署自定义Spring Security支持获取令牌账号密码:admin / admin版本

    IDEA开发工具下Spring Boot视频教程(下)整合篇

    着重介绍SpringBoot的与各大场景的整合使用,内容包括:缓存(整合Redis),消息中间件(整合RabbitMQ),检索(整合ElasticSearch),任务(异步任务,定时任务,邮件任务),安全(整合SpringSecurity),...

    WebService CXF学习文档

    做开发时,查了大量资料,发现一比较全面的资料,分享一下! WebService CXF学习——入门篇 1.CXF由来 2.HelloWorld 3.WSDL描述 WebService CXF学习——进阶篇 ... 3.WS-Security WebService CXF学习——JAXB剖析

    java面试题及技巧3

    │ Struts+Hibernate+Spring轻量级J2EE企业应用实战.pdf │ Struts中文手册.pdf │ Struts配置文件详解.txt │ 上海税友.txt │ 上海税友软件 面试题.doc │ 公司培训文档-混淆的基本概念.doc │ 基本算法.doc │ ...

    asp.net知识库

    如何在.NET中实现脚本引擎 (CodeDom篇) .NET的插件机制的简单实现 我对J2EE和.NET的一点理解 难分难舍的DSO(一) InternalsVisibleToAttribute,友元程序集访问属性 Essential .NET 读书笔记 [第一部分] ...

    java面试题以及技巧

    │ Struts+Hibernate+Spring轻量级J2EE企业应用实战.pdf │ Struts中文手册.pdf │ Struts配置文件详解.txt │ 上海税友.txt │ 上海税友软件 面试题.doc │ 公司培训文档-混淆的基本概念.doc │ 基本算法.doc │ ...

    java面试题目与技巧1

    │ Struts+Hibernate+Spring轻量级J2EE企业应用实战.pdf │ Struts中文手册.pdf │ Struts配置文件详解.txt │ 上海税友.txt │ 上海税友软件 面试题.doc │ 公司培训文档-混淆的基本概念.doc │ 基本算法.doc │ ...

    java面试题及技巧4

    │ Struts+Hibernate+Spring轻量级J2EE企业应用实战.pdf │ Struts中文手册.pdf │ Struts配置文件详解.txt │ 上海税友.txt │ 上海税友软件 面试题.doc │ 公司培训文档-混淆的基本概念.doc │ 基本算法.doc │ ...

    java面试题以及技巧6

    │ Struts+Hibernate+Spring轻量级J2EE企业应用实战.pdf │ Struts中文手册.pdf │ Struts配置文件详解.txt │ 上海税友.txt │ 上海税友软件 面试题.doc │ 公司培训文档-混淆的基本概念.doc │ 基本算法.doc │ ...

Global site tag (gtag.js) - Google Analytics