- 浏览: 348091 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
pacoson:
感谢楼主。请受小生一拜。
ANT预编译JSP -
zhuhongming123:
一楼的同学Lucene4.* 以上的 已经改成了Numeric ...
Lucene日期排序及组合查询 -
ywjk520:
RangeQuery在哪个包里?
Lucene日期排序及组合查询 -
willwen:
有个疑问,楼主,为何初始化bits 从txt读取已有的网址是直 ...
布隆过滤器(Bloom Filter)之java实例 -
yu_226528:
还不如没有呢
jFreeChart 在jsp页上实现简单的折线图、柱状图
# 一 、方式一:用户名密码都在配置文件中。 # <?xml version="1.0" encoding="UTF-8"?> # <beans:beans xmlns="http://www.springframework.org/schema/security" # 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-2.0.xsd # http://www.springframework.org/schema/security # http://www.springframework.org/schema/security/spring-security-2.0.4.xsd"> # # <http auto-config='true'> # <intercept-url pattern="/admin.jsp" access="ROLE_ADMIN" /> # <intercept-url pattern="/**" access="ROLE_USER" /> # </http> # # <authentication-provider> # <user-service> # <user name="admin" password="admin" authorities="ROLE_USER, ROLE_ADMIN" /> # <user name="user" password="user" authorities="ROLE_USER" /> # </user-service> # </authentication-provider> # # </beans:beans> # # # 二、方式二:运用spring security 提供的默认表结构,authentication部分修改如下: # <authentication-provider> # <jdbc-user-service data-source-ref="dataSource"/> # </authentication-provider> # # <beans:bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> # <beans:property name="driverClassName" value="org.hsqldb.jdbcDriver"/> # <beans:property name="url" value="jdbc:hsqldb:res:/hsqldb/test"/> # <beans:property name="username" value="sa"/> # <beans:property name="password" value=""/> # </beans:bean> # # # 三、方式三:运用原先本地的数据库,authentication修改如下: # <authentication-provider> # <jdbc-user-service data-source-ref="dataSource" # users-by-username-query="select username,password,status as enabled # from user # where username=?" # authorities-by-username-query="select u.username,r.name as authority # from user u # join user_role ur # on u.id=ur.user_id # join role r # on r.id=ur.role_id # where u.username=?"/> # </authentication-provider> # # 注: # users-by-username-query为根据用户名查找用户,系统通过传入的用户名查询当前用户的登录名,密码和是否被禁用这一状态。 # authorities-by-username-query为根据用户名查找权限,系统通过传入的用户名查询当前用户已被授予的所有权限。 # # 四、方式四;在方式三的基础上,修改登录页面 # 在xml中的http标签中添加一个form-login标签。 # # <http auto-config='true'> # <intercept-url pattern="/login.jsp" access="IS_AUTHENTICATED_ANONYMOUSLY" />[1] # <intercept-url pattern="/admin.jsp" access="ROLE_ADMIN" /> # <intercept-url pattern="/**" access="ROLE_USER" /> # <form-login login-page="/login.jsp"[2] # authentication-failure-url="/login.jsp?error=true"[3] # default-target-url="/" />[4] # </http> # # # 1、让没登陆的用户也可以访问login.jsp。[1] # # 这是因为配置文件中的“/**”配置,要求用户访问任意一个系统资源时,必须拥有ROLE_USER角色,/login.jsp也不例外,如果我们不为/login.jsp单独配置访问权限,会造成用户连登陆的权限都没有,这是不正确的。 # # 2、login-page表示用户登陆时显示我们自定义的login.jsp。[2] # # 这时我们访问系统显示的登陆页面将是我们上面创建的login.jsp。 # # 3、authentication-failure-url表示用户登陆失败时,跳转到哪个页面。[3] # # 当用户输入的登录名和密码不正确时,系统将再次跳转到/login.jsp,并添加一个error=true参数作为登陆失败的标示。 # # # 4、default-target-url表示登陆成功时,跳转到哪个页面。[4] # # 五、方式五:使用数据配置角色可以访问的资源(控制到URL级别)(可以参见工程005) # <!--从配置文件上可以看到,Spring Security所需的数据应该是一系列URL网址和访问这些网址所需的权限: # # <intercept-url pattern="/login.jsp" access="IS_AUTHENTICATED_ANONYMOUSLY" /> # <intercept-url pattern="/admin.jsp" access="ROLE_ADMIN" /> # <intercept-url pattern="/**" access="ROLE_USER" /> # # SpringSecurity 所做的就是在系统初始化时,将以上XML中的信息转换为特定的数据格式,而框架中其他组件可以利用这些特定格式的数据,用于控制之后的验证操作。现在这些资源信息都保存在数据库中了,从数据库中取出数据,然后让它等同于从xml文件中取出,需要做以下几步。 # --> # 1、实现一个符合该功能的类,主要参看该类中1-5步骤,了解即可。 # <!-- # # public class JdbcFilterInvocationDefinitionSourceFactoryBean # extends JdbcDaoSupport implements FactoryBean { # private String resourceQuery; # # public boolean isSingleton() { # return true; # } # # public Class getObjectType() { # return FilterInvocationDefinitionSource.class; # } # //4、 使用urlMatcher和requestMap创建DefaultFilterInvocationDefinitionSource。 # public Object getObject() { # return new DefaultFilterInvocationDefinitionSource(this # .getUrlMatcher(), this.buildRequestMap()); # } # //2、这样我们可以执行它的execute()方法获得所有资源信息。并把它封装到map中。 # # protected Map<String, String> findResources() { # ResourceMapping resourceMapping = new ResourceMapping(getDataSource(), # resourceQuery); # # Map<String, String> resourceMap = new LinkedHashMap<String, String>(); # # for (Resource resource : (List<Resource>) resourceMapping.execute()) { # String url = resource.getUrl(); # String role = resource.getRole(); # # if (resourceMap.containsKey(url)) { # String value = resourceMap.get(url); # resourceMap.put(url, value + "," + role); # } else { # resourceMap.put(url, role); # } # } # # return resourceMap; # } # # # /* <intercept-url pattern="/login.jsp" access="IS_AUTHENTICATED_ANONYMOUSLY" /> # <intercept-url pattern="/admin.jsp" access="ROLE_ADMIN" /> # <intercept-url pattern="/**" access="ROLE_USER" />*/ # # //3、使用获得的资源信息组装requestMap。再把第二步封装到map中的方法进一步加工,使它等价于“如spring从上面模式的配置文件中读取一样” # protected LinkedHashMap<RequestKey, ConfigAttributeDefinition> buildRequestMap() { # LinkedHashMap<RequestKey, ConfigAttributeDefinition> requestMap = null; # requestMap = new LinkedHashMap<RequestKey, ConfigAttributeDefinition>(); # # ConfigAttributeEditor editor = new ConfigAttributeEditor(); # # Map<String, String> resourceMap = this.findResources(); # # for (Map.Entry<String, String> entry : resourceMap.entrySet()) { # RequestKey key = new RequestKey(entry.getKey(), null); # editor.setAsText(entry.getValue()); # requestMap.put(key, # (ConfigAttributeDefinition) editor.getValue()); # } # # return requestMap; # } # # protected UrlMatcher getUrlMatcher() { # return new AntUrlPathMatcher(); # } # # public void setResourceQuery(String resourceQuery) { # this.resourceQuery = resourceQuery; # } # # private class Resource { # private String url; # private String role; # # public Resource(String url, String role) { # this.url = url; # this.role = role; # } # # public String getUrl() { # return url; # } # # public String getRole() { # return role; # } # } # //1、我们通过定义一个MappingSqlQuery实现数据库操作。 # private class ResourceMapping extends MappingSqlQuery { # protected ResourceMapping(DataSource dataSource, # String resourceQuery) { # super(dataSource, resourceQuery); # compile(); # } # # protected Object mapRow(ResultSet rs, int rownum) # throws SQLException { # String url = rs.getString(1); # String role = rs.getString(2); # Resource resource = new Resource(url, role); # # return resource; # } # } # } # # --> # 2、替换原有功能的切入点 # 在spring中配置我们编写的代码。 # # <beans:bean id="filterInvocationDefinitionSource" # class="com.family168.springsecuritybook.ch005.JdbcFilterInvocationDefinitionSourceFactoryBean"> # <beans:property name="dataSource" ref="dataSource"/> # <beans:property name="resourceQuery" value=" # select re.res_string,r.name # from role r # join resc_role rr # on r.id=rr.role_id # join resc re # on re.id=rr.resc_id # order by priority # "/> # </beans:bean> # # 下一步使用这个filterInvocationDefinitionSource创建filterSecurityInterceptor,并使用它替换系统原来创建的那个过滤器。 # # <beans:bean id="filterSecurityInterceptor" # class="org.springframework.security.intercept.web.FilterSecurityInterceptor" autowire="byType"> # <custom-filter before="FILTER_SECURITY_INTERCEPTOR" /> # <beans:property name="objectDefinitionSource" ref="filterInvocationDefinitionSource" /> # </beans:bean> # # 注意这个custom-filter标签,它表示将filterSecurityInterceptor放在框架原来的 FILTER_SECURITY_INTERCEPTOR过滤器之前,这样我们的过滤器会先于原来的过滤器执行,因为它的功能与老过滤器完全一样,所以这就等于把原来的过滤器替换掉了。 # # 3、完整的配置文件如下所示: # # <?xml version="1.0" encoding="UTF-8"?> # <beans:beans xmlns="http://www.springframework.org/schema/security" # 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-2.0.xsd # http://www.springframework.org/schema/security # http://www.springframework.org/schema/security/spring-security-2.0.4.xsd"> # # <http auto-config="true"/> # # <authentication-provider> # <jdbc-user-service data-source-ref="dataSource" # users-by-username-query="select username,password,status as enabled # from user # where username=?" # authorities-by-username-query="select u.username,r.name as authority # from user u # join user_role ur # on u.id=ur.user_id # join role r # on r.id=ur.role_id # where u.username=?"/> # </authentication-provider> # # <beans:bean id="filterSecurityInterceptor" # class="org.springframework.security.intercept.web.FilterSecurityInterceptor" autowire="byType"> # <custom-filter before="FILTER_SECURITY_INTERCEPTOR" /> # <beans:property name="objectDefinitionSource" ref="filterInvocationDefinitionSource" /> # </beans:bean> # # <beans:bean id="filterInvocationDefinitionSource" # class="com.family168.springsecuritybook.ch05.JdbcFilterInvocationDefinitionSourceFactoryBean"> # <beans:property name="dataSource" ref="dataSource"/> # <beans:property name="resourceQuery" value=" # select re.res_string,r.name # from role r # join resc_role rr # on r.id=rr.role_id # join resc re # on re.id=rr.resc_id # order by priority # "/> # </beans:bean> # # <beans:bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> # <beans:property name="driverClassName" value="org.hsqldb.jdbcDriver"/> # <beans:property name="url" value="jdbc:hsqldb:res:/hsqldb/test"/> # <beans:property name="username" value="sa"/> # <beans:property name="password" value=""/> # </beans:bean> # </beans:beans> # # # 4、允许动态增加某个用户权限。 # 目前存在的问题是,系统会在初始化时一次将所有资源加载到内存中,即使在数据库中修改了资源信息,系统也不会再次去从数据库中读取资源信息。这就造成了每次修改完数据库后,都需要重启系统才能时资源配置生效。 # # 解决方案是,如果数据库中的资源出现的变化,需要刷新内存中已加载的资源信息时,使用下面代码: # # <%@page import="org.springframework.context.ApplicationContext"%> # <%@page import="org.springframework.web.context.support.WebApplicationContextUtils"%> # <%@page import="org.springframework.beans.factory.FactoryBean"%> # <%@page import="org.springframework.security.intercept.web.FilterSecurityInterceptor"%> # <%@page import="org.springframework.security.intercept.web.FilterInvocationDefinitionSource"%> # <% # ApplicationContext ctx = WebApplicationContextUtils.getWebApplicationContext(application); # FactoryBean factoryBean = (FactoryBean) ctx.getBean("&filterInvocationDefinitionSource"); # FilterInvocationDefinitionSource fids = (FilterInvocationDefinitionSource) factoryBean.getObject(); # FilterSecurityInterceptor filter = (FilterSecurityInterceptor) ctx.getBean("filterSecurityInterceptor"); # filter.setObjectDefinitionSource(fids); # %> # <jsp:forward page="/"/>
- ch005.rar (13.2 KB)
- 下载次数: 44
发表评论
-
在Struts中基于Spring的AOP MethodInterceptor(拦截器)的权限验证
2010-08-13 13:34 1701本程序是关于"某考试系统"中的aop应用. ... -
反射实现 AOP 动态代理模式(2)
2010-08-05 12:40 936上面类中出现的Logger类和Level枚举还是和上一上例子的 ... -
反射实现 AOP 动态代理模式(1)
2010-08-05 12:37 905其实AOP的意思就是面向切面编程.OO注重的是我们解决问题的方 ... -
Spring事务配置的五种方式
2010-06-25 16:51 776前段时间对Spring的事务配置做了比较深入的研究,在此之间对 ... -
使用 Spring 2.5 注释驱动的 IoC 功能(2)
2010-06-25 16:37 896使用 JSR-250 的注释 Sprin ... -
使用 Spring 2.5 注释驱动的 IoC 功能(1)
2010-06-25 16:36 736概述 注释配置相对于 XML 配置具有很多的优势: 它可以 ... -
spring事务配置方法(BeanNameAutoProxyCreator)
2010-05-11 15:18 1057采用这种配置策略,完全可以避免增量式配置,所有的事务代理由系统 ... -
spring事务配置方法(TransactionProxyFactoryBean)
2010-05-11 15:10 1082采用这种方式的配置时候,配置文件的增加非常快,每个bean有需 ... -
spring事务配置方法(TransactionProxyFactoryBean继承)
2010-05-11 15:07 1124大部分情况下,每个事务代理的事务属性大同小异,事务代理的实现类 ... -
spring事务配置方法(BeanNameAutoProxyCreator)
2010-05-11 15:05 1136采用这种配置策略,完全可以避免增量式配置,所有的事务代理由系统 ... -
spring声明式事务
2010-05-11 14:26 839Spring中几种常见的事务配置,是Aop和Ioc的充分体现以 ... -
Spring AOP 入门实例
2010-05-01 19:18 854AOP 面向切面,可以让我们在不修改业务代码的前提下,在业务代 ... -
使用动态代理实现简单AOP
2010-05-01 19:02 797Spring默认使用JDK动态代理来实现AOP,如果业务对象没 ... -
Sping acegi 配置文件
2010-05-01 18:23 967applicationContext-acegi-securi ... -
Spring的BeanFactory
2010-05-01 18:17 783一、Spring装配Bean的过程 1. 实例化; 2. 设置 ... -
使用Spring方法注入协调不同步的bean
2010-05-01 18:00 1235<?xml version="1.0" ... -
几种加载Spring的配置文件的方式
2010-05-01 16:49 1290package com.liu.test; pu ... -
Quartz在Spring中动态设置cronExpression
2009-11-20 15:26 1242什么是动态定时任务:是由客户制定生成的,服务端只知道该去执行什 ... -
使用Spring发邮件
2009-11-07 14:15 994关于Spring的邮件发送的功能演示: (我把程序中一些敏感 ... -
Spring中的Quartz配置
2009-11-07 10:16 912Quartz是一个强大的企业级任务调度框架,Spring中继承 ...
相关推荐
在本文中,我们将深入探讨Spring Security的配置文件小结,逐步深化到URL级别的保护。 首先,我们需要理解Spring Security的核心组件。这些包括`WebSecurityConfigurerAdapter`,这是自定义安全配置的主要入口点;`...
"spring security 配置文件小结(1) - - JavaEye技术网站.mht" 另一份资源可能总结了Spring Security配置文件的关键元素,这对于初学者理解框架的工作机制非常有帮助。配置文件通常包括`applicationContext-security....
- **添加Spring Security XML配置文件的应用到web.xml**:进一步说明如何整合Spring Security配置与应用的主要配置文件。 - **注意这些不足之处**:列举了一些常见的配置错误或陷阱,帮助开发者避免这些坑。 - **...
- **添加Spring Security XML配置文件的应用到web.xml**:进一步指导如何整合Spring Security配置。 - **注意这些不足之处**:列举可能遇到的问题并提供解决方案。 - **常见问题**:针对开发者可能遇到的典型问题给...
首先,在 Spring Security 的配置文件中,我们需要增加一个 remember-me 配置: ```xml <security:http auto-config="true" use-expressions="false"> <!-- 配置链接地址,表示任意路径都需要 ROLE_USER 权限 --> ...
Spring Security与Shiro的使用 Spring Security和Shiro都...小结 Shiro是一个功能强大且灵活的安全框架,提供了许可、认证、加密和会话管理功能。通过自定义Realm,我们可以实现自己的认证逻辑,满足不同的业务需求。
1.5 使用配置文件配置容器 1.5.1 问题描述 1.5.2 解决方案 1.5.3 实现方法 1.6 小结 第2章 Spring简介 2.1 Spring Framework 2.1.1 Spring的模块介绍 2.1.2 ...
1.5 使用配置文件配置容器 1.5.1 问题描述 1.5.2 解决方案 1.5.3 实现方法 1.6 小结 第2章 Spring简介 2.1 Spring Framework 2.1.1 Spring的模块介绍 2.1.2 ...
1.5 使用配置文件配置容器 1.5.1 问题描述 1.5.2 解决方案 1.5.3 实现方法 1.6 小结 第2章 Spring简介 2.1 Spring Framework 2.1.1 Spring的模块介绍 2.1.2 Spring的...
第5章 Spring Security 164 5.1 加强URL访问安全 165 5.1.1 问题 165 5.1.2 解决方案 165 5.1.3 工作原理 166 5.2 登录到Web应用 175 5.2.1 问题 175 5.2.2 解决方案 175 5.2.3 工作原理 175 5.3...
第一部分 Spring的核心 第1章 开始Spring之旅 1.1 Spring是什么 1.2 开始Spring之旅 1.3 理解依赖注入 1.3.1 依赖注入 1.3.2 DI应用 1.3.3 企业级应用中的依赖注入 1.4 应用AOP ...B.4 小结
- [Spring Boot Actuator监控端点小结](http://blog.didispace.com/spring-boot-actuator-1/) - [在传统Spring应用中使用spring-boot-actuator模块提供监控端点]...
第一部分 Spring的核心 第1章 开始Spring之旅 1.1 Spring是什么 1.2 开始Spring之旅 1.3 理解依赖注入 1.3.1 依赖注入 1.3.2 DI应用 1.3.3 企业级应用中的依赖注入 1.4 应用AOP ...B.4 小结
第5章 Spring Security 164 5.1 加强URL访问安全 165 5.1.1 问题 165 5.1.2 解决方案 165 5.1.3 工作原理 166 5.2 登录到Web应用 175 5.2.1 问题 175 5.2.2 解决方案 175 5.2.3 工作原理 175 5.3...
目录 第一部分spring的核心 第1章开始spring之旅 1.1spring是什么 1.2开始spring之旅 1.3理解依赖注入 ...1.5小结 ...2.6小结 ...3.5.3配置属性的外在化 ...3.7小结 ...4.6小结 ...5.2配置数据源 ...5.6.1配置ibatis客户模板 ...b.4小结
#### 三、小结 通过本章的学习,我们了解了Spring Boot的核心优势——简化依赖管理和自动化配置。掌握了如何利用Spring Boot Starters快速搭建项目基础框架以及如何利用Spring Boot的自动配置机制减少重复性的工作...