一步一步教你使用SpringSecurity

合集下载

详解SpringSecurity认证流程

详解SpringSecurity认证流程

详解SpringSecurity认证流程前⾔Spring Seuciry相关的内容看了实在是太多了,但总觉得还是理解地不够巩固,还是需要靠知识输出做巩固。

相关版本:java: jdk 8spring-boot: 2.1.6.RELEASE过滤器链和认证过程⼀个认证过程,其实就是过滤器链上的⼀个绿⾊矩形Filter所要执⾏的过程。

基本的认证过程有三步骤:1. Filter拦截请求,⽣成⼀个未认证的Authentication,交由AuthenticationManager进⾏认证;2. AuthenticationManager的默认实现ProviderManager会通过AuthenticationProvider对Authentication进⾏认证,其本⾝不做认证处理;3. 如果认证通过,则创建⼀个认证通过的Authentication返回;否则抛出异常,以表⽰认证不通过。

要理解这个过程,可以从类UsernamePasswordAuthenticationFilter,ProviderManager,DaoAuthenticationProvider和InMemoryUserDetailsManager(UserDetailsService实现类,由UserDetailsServiceAutoConfiguration默认配置提供)进⾏了解。

只要创建⼀个含有spring-boot-starter-security的springboot项⽬,在适当地打上断点接⼝看到这个流程。

⽤认证部门进⾏讲解)请求到前台之后,负责该请求的前台会将请求的内容封装为⼀个Authentication对象交给认证管理部门,认证管理部门仅管理认证部门,不做具体的认证操作,具体的操作由与该前台相关的认证部门进⾏处理。

当然,每个认证部门需要判断Authentication是否为该部门负责,是则由该部门负责处理,否则交给下⼀个部门处理。

spring-security新手入门

spring-security新手入门

例子一1.去 /release/org/springframework/spring/ 下载spring开发包,这里以spring-3.2.9 版本为例。

点击,再点击即可下载2.把下载的zip解压出来,在目录spring-framework-3.2.9.RELEASE\libs\下,拷贝以下jar包:,还不够,还差commons-logging.jar和spring-security的jar包spring-security-acl.jarspring-security-config.jarspring-security-core.jarspring-security-taglibs.jarspring-security-web.jar建议大家到这个网站下载/maven是很流行的包管理库,里面几乎什么包都有,打开后应该是这样子输入包名——回车应该出来这样子看到了吗点它,进去选一个自己需要的版本下载假如我点了跳转到下载页再点就可以了第二步配置下载好所有jar后,我创建一个叫testSpringSecurity的项目,把需要用到的jar拷贝到lib下,完了之后是这样子在WEB-INF下创建web.xml文件,填入以下内容:<?xml version="1.0"encoding="UTF-8"?><web-app version="3.0"xmlns="/xml/ns/javaee"xmlns:xsi="/2001/XMLSchema-instance"xsi:schemaLocation="/xml/ns/javaee/xml/ns/javaee/web-app_3_0.xsd"><display-name>spring-security</display-name><!-- 加载spring配置文件 --><context-param><param-name>contextConfigLocation</param-name><param-value>classpath:applicationContext*.xml</param-value> </context-param><!--DelegatingFilterProxy就是一个对于servlet filter的代理,用这个类的好处主要是通过Spring容器来管理servlet filter的生命周期,还有就是如果filter中需要一些Spring容器的实例,可以通过spring 直接注入,另外读取一些配置文件这些便利的操作都可以通过Spring来配置实现。

SpringSecurity使用记录(五)-- 配置

SpringSecurity使用记录(五)-- 配置

SpringSecurity使用记录(五)-- 配置研究了好长时间,不知道从哪里下手。

新的版本,很多东西在网上找不到,只能看他们的文档,当然这些文档相当不错,就看是否耐心的研究了!总是有急躁的心理作祟,不能专心研读,却处处碰壁,效率上反而未达预期效果!终于,在无数次的沮丧下,稍微看到了点光亮!前面的文章太过皮毛,接下来的一些,希望能更加实际的,更加深入的分析每一个过程!一直通过默认配置进行设置:namespace(是security 3.0,网上也看到一些兄弟描述的是3.0,但是总是不符合我这里的namespace配置):<beans:beans xmlns="/schema/security"xmlns:beans="/schema/beans"xmlns:xsi="/2001/XMLSchema-instance"xsi:schemaLocation="/schema/beans /schema/beans/spring-beans-3.0.xsd/schema/security/schema/security/spring-security-3.0.xsd">按照默认配置的http(这是用来根据namespace设置的基本的security过滤器chain):auto-config=true时,就相当于<http><form-login /><http-basic /><logout /></http>也就是使用了默认的过滤器。

我最开始的想法是能够把本地的login信息(不是调用spring security的login方法),传入到spring security的验证过滤器里面。

这里有一个比较关键的问题,就是封装他们的过滤器(或者仅仅是知道他们到底是哪些过滤器在起作用):表1Alia s FilterClassNamespaceElementorAttributeCHA NNE L_FI LTE R ChannelProcessingFilterhttp/intercept-url@requires-channelCON CUR REN ConcurrentSessisession-management/concurrenT_S ESS ION _FIL TER onFiltercy-controlSECURI TY_ CON TEX T_FI LTE R Securi tyContextPersistenceFilterhttpLOGOUT _FIL TER LogoutFilterhttp/logoutX50 9_FI LTE R X509AuthenticationFilterhttp/x509PRE _AU TH_ FILT ER Astrac tPreAuthenticatedProcessingFilterSubc lassesN/ACAS _FIL TER CasAu thenti cationFilterN/AFOR M_L OGI N_F ILTE R UsernamePasswordAuthenticationFilterhttp/form-loginBAS IC_BasicAuthehttp/http-basicAUT H_F ILTE R nticati onFilt erSERVLE T_A PI_ SUP POR T_FI LTE R SecurityContextHolderAwareFilterhttp/@servlet-api-provisionREM EMB ER_ ME_ FILT ER RememberMeAuthenticationFilterhttp/remember-meANO NYM OUS _FIL TER AnonymousAuthenticationFilterhttp/anonymousSESSIO N_M ANA GEM ENT _FIL TER SessionManagementFiltersession-managementEXC EPTION_ TRA NSL ATI ON_ FILT ER ExceptionTranslat ionFilterhttpFILT ER_FilterSecurihttpSEC URI TY_I NTE RCE PTO R tyInte rcept orSWITCH _US ER_ FILT ER SwitchUserFilterN/A(最开始看的时候,把这个表格忽略了,现在看来这些就是我们想要的!)我们的验证过程,就是按照这样的顺序进行的。

SpringBoot+SpringSecurity基本使用及个性化登录配置详解

SpringBoot+SpringSecurity基本使用及个性化登录配置详解

SpringBoot+SpringSecurity基本使⽤及个性化登录配置详解Spring Security 基本介绍这⾥就不对Spring Security进⾏过多的介绍了,具体的可以参考我就只说下SpringSecurity核⼼功能:1. 认证(你是谁)2. 授权(你能⼲什么)3. 攻击防护(防⽌伪造⾝份)基本环境搭建这⾥我们以SpringBoot作为项⽬的基本框架,我这⾥使⽤的是maven的⽅式来进⾏的包管理,所以这⾥先给出集成Spring Security的⽅式<dependencies>...<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-security</artifactId></dependency>...</dependencies>然后建⽴⼀个Web层请求接⼝@RestController@RequestMapping("/user")public class UserController {@GetMappingpublic String getUsers() {return "Hello Spring Security";}}接下来可以直接进⾏项⽬的运⾏,并进⾏接⼝的调⽤看看效果了。

通过⽹页的调⽤但是我们是没法正常访问的,出现了下图的⾝份验证输⼊框这是因为在SpringBoot中,默认的Spring Security就是⽣效了的,此时的接⼝都是被保护的,我们需要通过验证才能正常的访问。

Spring Security提供了⼀个默认的⽤户,⽤户名是user,⽽密码则是启动项⽬的时候⾃动⽣成的。

我们查看项⽬启动的⽇志,会发现如下的⼀段LogUsing default security password: 62ccf9ca-9fbe-4993-8566-8468cc33c28c当然你看到的password肯定和我是不⼀样的,我们直接⽤user和启动⽇志中的密码进⾏登录。

SSO单点登录Spring-SecurityCAS使用手册

SSO单点登录Spring-SecurityCAS使用手册

SSO单点登录Spring-SecurityCAS使⽤⼿册1.1概述1.1.1单点登录介绍单点登录(Single Sign On , 简称 SSO )是⽬前⽐较流⾏的服务于企业业务整合的解决⽅案之⼀, SSO 使得在多个应⽤系统中,⽤户只需要登录⼀次就可以访问所有相互信任的应⽤系统。

CAS(Central Authentication Service)是⼀款不错的针对 Web 应⽤的单点登录框架。

本⽂介绍了 CAS 的原理、协议、以及配合Spring-Security在 Tomcat 中的配置和使⽤。

1.1.2 CAS 、Spring Security介绍CAS 是 Yale ⼤学发起的⼀个开源项⽬,旨在为 Web 应⽤系统提供⼀种可靠的单点登录⽅法,CAS 在 2004 年 12 ⽉正式成为 JA-SIG 的⼀个项⽬。

CAS 具有以下特点:开源的企业级单点登录解决⽅案。

CAS Server 为需要独⽴部署的 Web 应⽤。

CAS Client ⽀持⾮常多的客户端(这⾥指单点登录系统中的各个 Web 应⽤),包括 Java, .Net, PHP, Perl, Apache, uPortal, Ruby 等。

Spring Security为基于J2EE企业应⽤软件提供了全⾯安全服务。

Spring Security⼴泛⽀持各种⾝份验证模式。

这些验证模型绝⼤多数都由第三⽅提供,或正在开发的有关标准机构提供的,例如Internet Engineering Task Force。

作为补充,Spring Security也提供了⾃⼰的⼀套验证功能。

1.1.3 CAS 原理和协议从结构上看,CAS 包含两个部分: CAS Server 和 CAS Client。

CAS Server 需要独⽴部署,主要负责对⽤户的认证⼯作;CAS Client 负责处理对客户端受保护资源的访问请求,需要登录时,重定向到 CAS Server。

SpringSecurity技术的应用与实践

SpringSecurity技术的应用与实践

SpringSecurity技术的应用与实践Spring Security 技术是一种非常流行的安全框架,可以通过它来保护 Web 应用程序的安全性和可靠性。

这个框架能够轻松地集成到现有的应用程序中,并提供了一些非常有用的功能,例如身份验证、权限管理、安全保护等等。

本文将介绍 Spring Security 技术的应用与实践,帮助开发人员更好地理解和利用这个框架。

一、Spring Security 技术的基本概念Spring Security 是一个基于 Spring 框架的安全框架,它提供了一些非常有用的功能,例如身份验证、授权、使用 SSL、跨站点请求伪造(CSRF)防范等等。

Spring Security 安全框架是由一系列过滤器链组成的。

每个过滤器链都包含一系列的过滤器。

当请求进入应用程序时,它首先会被第一个过滤器链所处理,然后进入第二个过滤器链,以此类推,直到最后一个过滤器链。

Spring Security 技术的核心是基于基于Servlet API 进行实现的。

它定义了一组过滤器,可以自定义配置,从而实现常见的安全保护,例如用户认证和授权等。

二、Spring Security 技术的应用场景Spring Security 技术可以应用到各种 Web 应用程序中,有以下几种常见的场景。

1.登录页面控制登录页面控制是 Web 应用程序必不可少的安全措施之一。

为了防止不受欢迎的访问,不应向未经验证的用户展示重要的信息。

Spring Security 技术可以实现登录页面控制,强制用户在访问应用程序的其他位置之前登录。

2.授权控制授权控制是另一个基本的安全需求,可以限制对应用程序的某些部分或操作的访问。

根据用户的角色或组,可以授予不同级别的访问权限。

Spring Security 技术可以实现授权控制,确保不被授权的用户无法访问敏感信息或执行重要操作。

3.会话管理会话管理是应用程序中非常重要的安全需求之一。

springsecurity认证流程

springsecurity认证流程
1、用户访问受保护的资源
2、springsecurity会从会话中获取已经登录的信息,如果为空,则进行进行认证
3、springsecurity会根据项目中配置的登录页面,跳转到登陆页面
4、用户在登陆页面输入合法的用户名和密码
5、springsecurity会将用户名和密码提交给配置的认证管理器(AuthenticationManager)
6、认证管理器会调用配置的用户服务(UserDetailsService)根据用户名查询用户信息
7、如果用户不存在,则认证失败,返回登录界面;如果用户存在,则继续
8、用户服务会根据查询到的用户信息,和用户输入的密码,生成一个 Authentication 对象
9、认证管理器会将 Authentication 对象交给配置的密码比较器(PasswordEncoder),进行密码的比较
10、验证通过后,创建一个 SecurityContext 并将 Authentication 对象存储到 SecurityContext 对象中
11、将 SecurityContext 对象存入会话中,并将授权决策管理器AuthorizationManager 存入 SecurityContext 中
12、重定向到用户原始请求的URL。

SpringSecurity怎样使用注解控制权限

SpringSecurity怎样使⽤注解控制权限⼀般的系统在权限设计上,都会分为⾓⾊、权限(RDBC),复杂⼀点的可能会有⽤户组、组织之类的概念。

⽤户的权限是写死的,对应于后台的接⼝或者资源,是没办法改变的,⼀般不对⽤户开放修改权限。

管理员⽤户可以通过给⾓⾊分配权限的⽅式,来实现访问控制。

所以当我们写过滤器,或者⽤⼀些安全框架时(⽐如Shiro,Spring Security),也需要将可变的“⾓⾊”,转化为不可变的“权限”,注⼊到框架中。

具体的可以看我之前写的⼀篇()注⼊当前⽤户的权限后,就需要进⾏访问控制了。

常见的做法有1、路径⽐对之前有个项⽬⽤过⼀次,定义⼀个过滤器,添加到security的过滤链中,在这个过滤器中做这么⼀件事:分析当前访问路径所需要的权限,检查当前⽤户是否具有该权限,做⼀个对⽐,根据对⽐结果来决定当前⽤户是否可以访问该资源。

这种做法的好处是代码的⼊侵性不⾼,不需要再每个接⼝上加注解。

但相对来说,显得不那么直观,可读性⽐较差,所以这次换个⽅法。

2、使⽤注解的⽅式SpringSecurity使⽤注解来控制访问时,需要提前开启这个功能。

在配置类上加上注解@Configuration@EnableWebSecurity@EnableGlobalMethodSecurity(prePostEnabled = true)public class SecurityConfig extends WebSecurityConfigurerAdapter {在接⼝中如此使⽤/*** 条件查询*/@PreAuthorize("hasAuthority('IMPORT:SELECT')")@ApiOperation(value = "查询")@GetMapping("/list")public R<Page<Task>> list(TaskDto taskDto){//测试阶段,随机⽣成任务Random random = new Random();//todoint i = random.nextInt(4);if(i == 2) {metroServerAdapterService.reloadShelveTask();}Page<Task> list = taskService.list(taskDto);return R.ok(list);}hasAuthority可以替换成hasRole,虽然可以达到相同的⽬的,但是在使⽤的⽅法上还是有些不同的。

SpringSecurity流程解释与配置

SpringSecurity流程解释与配置1.Spring Security流程解释流程图SpringSecurity 采⽤的是责任链的设计模式,它有⼀条很长的过滤器链 流程⼤致解释客户端发起⼀个请求进⼊security的过滤链,将 Security 上下⽂异步映射继承之后储存在SecurityContextPersistenceFilte中⾛到登录判断之后,登出则是logoutHandler成功的话会到logoutSuccessHandler失败ExceptionTranslationFilter,如果不是登出的话则会进⼊下个过滤器⾸先DefaultLoginPageGeneratingFilter处会查询有么有配置的登录页⾯如果有则跳⼊配置的没有则跳⼊默认的然后判断是否为登录请求,如果是则进⼊UsernamePasswordAuthenticationFilter,如果登录失败则到 AuthenticationFailureHandler 登录失败处理器处理,如果登录成功则到AuthenticationSuccessHandler 登录成功处理器处理,如果不是登录请求则不进⼊该过滤器 具体参数解释WebAsyncManagerIntegrationFilter:将 Security 上下⽂与 Spring Web 中⽤于处理异步请求映射的 WebAsyncManager 进⾏集成。

SecurityContextPersistenceFilter:在每次请求处理之前将该请求相关的安全上下⽂信息加载到 SecurityContextHolder 中,然后在该次请求处理完成之后,将 SecurityContextHolder 中关于这次请求的信息存储到⼀个“仓储”中,然后将 SecurityContextHolder 中的信息清除,例如在Session中维护⼀个⽤户的安全信息就是这个过滤器处理的。

SpringSecurity使用详解(基本用法)

SpringSecurity使⽤详解(基本⽤法)Spring Security使⽤详解(基本⽤法)1,什么是 Spring Security ?Spring Security 是⼀个相对复杂的安全管理框架,功能⽐ Shiro 更加强⼤,权限控制细粒度更⾼,对 OAuth 2 的⽀持也更友好。

由于 Spring Security 源⾃ Spring 家族,因此可以和 Spring 框架⽆缝整合,特别是 Spring Boot 中提供的⾃动化配置⽅案,可以让 Spring Security 的使⽤更加便捷。

2,安装配置<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-security</artifactId></dependency>3、开始测试:⾸先在项⽬添加⼀个简单的 /hello 接⼝:@RestControllerpublic class HelloController {@GetMapping("/hello")public String hello() {return "欢迎访问 ";}}接着启动项⽬,直接访问 /hello 接⼝则会⾃动跳转到登录页⾯(这个登录页⾯是由 Spring Security 提供的)(3)我们必须登录后才能访问 /hello 接⼝。

默认⽤户名是 user,⽽登录密码则在每次启动项⽬时随机⽣成,我们可以在项⽬启动⽇志中找到。

(4)登录后则会⾃动跳转到之前我访问的 /hello 接⼝:4,配置⽤户名和密码如果对默认的⽤户名和密码不满意,可以在 application.properties 中配置默认的⽤户名、密码和⾓⾊。

这样项⽬启动后就不会随机⽣成密码了,⽽是使⽤我们配置的⽤户、密码,并且登录后还具有⼀个 admin ⾓⾊(关于⾓⾊的⽤法再后⾯的⽂章会相信介绍)。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

Copyright©2010吴青版权所有Spring Security3.0什么是Spring Security?Spring Security,这是一种基于Spring AOP和Servlet过滤器[7]的安全框架。

它提供全面的安全性解决方案,同时在Web请求级和方法调用级处理身份确认和授权。

在Spring Framework基础上,Spring Security充分利用了依赖注入(DI,Dependency Injection)和面向切面技术。

获取Spring Security 3.0Copyright©2010吴青版权所有解压:dist :目录中存放发布包docs :存放文档入门新建web 工程为工程添加Spring支持Copyright©2010吴青版权所有我这里使用的是MyEclipse6.6 版本,该版本中的Spring 的版本是Spring 2.5 ,而Spring Security3.0 使用的是Spring 3.0 ,这里加入Spring 支持是为了让工具为我们自动添加Spring 的配置文件。

Spring Security3.0.2 下载解压后的dist 目录中有两个war 包,这两个war 包是示例程序将其中的一个示例程序的 .war 扩展名改成.rar ,将其解压出来,将压缩包中的 WEB-INF/lib 总的所有的jar 包拷贝到我们的工程中,在拷贝之前先清除掉MyEclipse 帮助我们加入的jar 包。

添加后的结果:将这些工具帮助我们加入的jar包全部移除掉,然后加入.war中Copyright©2010吴青版权所有几个包的含义:Copyright©2010吴青版权所有Copyright©2010吴青版权所有:包含了核心认证和权限控制类和接口, 运程支持和基本供应API 。

使用Spring Security 所必须的。

支持单独运行的应用, 远程客户端,方法(服务层)安全和JDBC 用户供应:包含过滤器和对应的web 安全架构代码。

任何需要依赖servlet API 的。

如果需要Spring Security Web 认证服务和基于URL 的权限控制都需要它开始配置首先配置web.xml 文件在web.xml 文件中添加一个过滤器,这个过滤器不在security 包中. ,它可以代理一个application context 中定义的Spring bean 所实现的filterDelegatingFilterProxy 做的事情是代理Filter 的方法,从application context 里获得bean (这些bean 就是Spring Security 中的核心部分,过滤器。

这些过滤器被定义在了Spring 容器中)。

这让bean 可以获得spring web application context 的生命周期支持,使配置较为轻便。

bean必须实现javax.servlet.Filter接口,它必须和filter-name里定义的名称是一样的。

DelegatingFilterProxy这个类在spring-web-3.0.0RELEASE.jar包中Copyright©2010吴青版权所有Copyright©2010吴青版权所有1. 在web.xml 中通过监听器启动spring 容器2. 在Spring 的配置文件中引入Spring Security 的xml 命名空间,这需要修改原来的applicationContext.xml 文件. 这些代码在下载的文档或者示例应用程序中都能够找到Spring Security 配置以下的代码都在 applicationContext.xml 文件中配置Copyright©2010吴青版权所有这表示,我们要保护应用程序中的所有URL ,只有拥有 ROLE_USER 角色的用户才能访问。

<http>元素是 所有web 相关的命名空间功能的上级元素。

<intercept-url>元素定义了 pattern ,用来匹配进入的请求URL ,上面的表示拦截根,以及根子目录下的所有的路径。

access 属性定义了请求匹配了指定模式时的需求。

使用默认的配置, 这个一般是一个逗号分隔的角色队列,一个用户中的一个必须被允许访问请求。

前缀“ROLE_”表示的是一个用户应该拥有的权限比对。

上面的配置中只有角色是 ROLE_USER 的用户才能访问,那么ROLE_USER 在哪里定义呢?所以下面的工作就是定义ROLE_USER如果用户名为user ,密码为user 的用户成功登录了,它的角色是ROLE_USER ,那么他可以访问规定的资源。

编写首页目前为止,项目中只有一个index.jsp 在这个页面上只需要写一句话将项目部署到web服务器中,然后访问首页index.jsp,我们发现首页并没有出现,而是跳转到了一个登录页面上。

因为项目刚启动,第一次访问的时候,没有任何用户登录,而在配置文件中我们拦截的是所有的请求,所以第一次请求被拦截了。

Copyright©2010吴青版权所有输入刚才在配置文件中配置的用户名:user,密码:user,提交后,发现能够正确的转到首页问题: 那个登录页面哪里来的?当有请求道来的时候,Spring Security框架开始检查要访问的资源是否有权访问,如果当前登录用户无权或者当前根本就没有用户登录,则Spring Securtiy 框架就自动产生一个登录页面。

当在登录页面进行了正确的登录后,Spring Security会自动进行登录验证,如果成功登录,将用户信息放到session中,然后转到先前请求的页面上。

我们可以在index中将session中的key—value打印出来,看看Spring Security 将用户信息如何放到session中的:Copyright©2010吴青版权所有Copyright©2010吴青版权所有可以看到 :用户使用 的key 为: SPRING_SECURITY_LAST_USERNAME进阶I在入门部分有明显缺陷:A) 一般登录页面都是我们自己编写的,并且登录页面是不需要验证直接可以访问的。

B)用户名和密码直接写在配置文件中,而实际项目中我们是放在数据库中的。

指定登录页面在前面的例子中,我们在Spring Security框架生成的登录页面中直接输入用户名和密码后,Spring Security框架替我们进行验证的,那么HTTP请求的时候,向web服务器提交了什么样的数据呢?我们打开生成的登录页面的源代码:由于验证过程是Spring Security框架自动完成的,所以在我们的登录页面中表单元素的name 都是固定的。

下面是我们自己编写的登录页面: login.jspCopyright©2010吴青版权所有Copyright©2010吴青版权所有写完登录页面之后,得让Spring Security 框架知道哪个页面是登录页面,当需要登录的时候,Spring Security 框架会自动跳转到这个登录页面上。

所以得在applicationContext.xml 文件中进行配置启动浏览器访问index.jsp,我们发现自动跳转到login.jsp页面上了。

Copyright©2010吴青版权所有如果输入不正确的用户名或者密码,页面中没有任何错误消息提示,怎么样才能将错误消息显示出来呢?国际化输出Spring Security 框架将所有的错误信息都定义成了异常,并且提供了国际化的资源文件。

这个资源文件在 spring-security-core-xxx.jar文件中Copyright©2010吴青版权所有在配置文件中指定使用的资源文件。

这里定义的messageSource 对象被spring Security 框架内部使用。

在jsp 文件中取出错误消息,Spring Security 框架将抛出的异常对象放到了session 范围中,key 是: SPRING_SECURITY_LAST_EXCEPTION,取出的是异常对象,所以还要调用getMessage()方法取出真正的错误信息Copyright©2010吴青版权所有自定义错误消息在src 中新建一个message_zh_CN.properties文件在applicationContext.xml中指定资源文件。

Copyright©2010吴青版权所有Copyright©2010吴青版权所有对密码进行加密上面的配置中,密码以明文的形式出现在了配置文件中,这是非常危险的。

所以我们可以将真实密码经过加密之后的结果放到配置文件中。

这需要在配置文件中指明使用什么样的加密算法。

MD5是一种不可逆的加密算法,验证的时候,将用户输入的密码经过MD5加密之后的结果再与配置文件中配置的密文进行比较,如果相同则通过验证。

admin 经过MD5加密之后的结果是:21232f297a57a5a743894a0e4a801fc3于是作如下配置:将权限放入数据库保存前面将用户名和密码,还有权限都定义在了配置文件中,而实际项目中需要将这些放到数据数据库中,那么这些信息在数据库中的表结构是什么,能不能自己定义呢?spring Security 将表结构已经定义好了,我们可以参考 发行文档中的 附录A/*用户表*/create table users(username varchar_ignorecase(50) not null primary key, /*用户名*/ password varchar_ignorecase(50) not null, /*密码*/enabled boolean not null /*是否禁用*/ );/*权限表*/create table authorities(username varchar_ignorecase(50) not null,authority varchar_ignorecase(50) not null,constraint fk_authorities_users foreign key(username) references users(username));create unique index ix_auth_username on authorities (username,authority);Copyright©2010吴青版权所有插入数据:INSERT INTO users(username,PASSWORD,enabled)VALUES('admin','21232f297a57a5a743894a0e4a801fc3',1);/*密码是字符串admin加密后的结果*/INSERT INTO users(username,PASSWORD,enabled)VALUES('user','ee11cbb19052e40b07aac0ca060c23ee',1);/*密码是字符串user 加密后的结果*/INSERT INTO authorities VALUES('admin','ROLE_ADMIN');INSERT INTO authorities VALUES('user','ROLE_USER');Copyright©2010吴青版权所有Copyright©2010吴青版权所有·修改配置文件A) 在配置文件中加入数据源,因为要访问数据库,所以还要加入MySQL 的驱动<bean id ="datasource" class ="org.springframework.jdbc.datasource.DriverManagerDataSource"> <property name ="driverClassName"value ="com.mysql.jdbc.Driver"> </property ><property name ="url"value ="jdbc:mysql://localhost:3306/springDB?useUnicode=true&amp;characterEncodi ng=utf8"></property ><property name ="username" value ="root"></property ><property name ="password" value ="root"></property ></bean >B) 将原来的user-service 注释起来,再提供一个userService ,使用刚刚配置的dataSource<!-- 配置认证管理器 --><security:authentication-manager > <security:authentication-provider > <security:password-encoder hash ="md5" /> <!--<security:user-service> <security:user name="admin" password="21232f297a57a5a743894a0e4a801fc3"authorities="ROLE_USER" /></security:user-service> --><security:jdbc-user-service data-source-ref ="datasource"/></security:authentication-provider ></security:authentication-manager>Copyright©2010吴青版权所有在做实验之前,首先看看权限相关的配置:如果我们需要完成这样的功能:A) 系统中除了login.jsp 可以直接访问以外,其它的页面都需要权限才能进入 B) index.jsp 页面 ROLE_USER 和ROLE_ADMIN 都可以访问; C) admin.jsp 页面只有ROLE_ADMIN 权限可以访问 index.jsp 页面内容如下:admin.jsp页面内容:Copyright©2010吴青版权所有上面的配置能满足要求吗?下面做实验验证:启动项目,直接访问login.jsp,输入用户名 user ,密码user登录之后:Copyright©2010吴青版权所有然后访问admin.jsp 页面可以访问,这里无法满足我满上面的要求,为什么?我们仔细观察上面的配置,admin.jsp 并没有配置访问权限,所以我们在配置文件中添加配置:Copyright©2010吴青版权所有重新启动项目后,点击链接,发现访问被拒绝.这样满足了我们的要求再以admin 用户进行登录,登录后我们也发现:Copyright©2010吴青版权所有我们要求admin 用户可以访问index.jsp,为什么这里被拒绝了呢?看看配置文件:我们发现 index.jsp 实际上匹配的是/** ,要求ROLE_USER 才能访问,ROLE_ADMIN 就自然不能访问了修改配置文件:自定义访问被拒绝页面修改后满足了我们的要求。

相关文档
最新文档