Spring_Security-3.0.1_中文自学教程

合集下载

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(最开始看的时候,把这个表格忽略了,现在看来这些就是我们想要的!)我们的验证过程,就是按照这样的顺序进行的。

Spring Security培训PPT课件

Spring Security培训PPT课件
Spring Security
2011-03-28
流程介绍
• Spring Security 简介 • Spring Security 11种过滤器介绍 • Spring Security 基本配置 • Spring Security 总结
Spring Security 简介
• 这里提到的Spring Security也就是被大家广为熟悉的Acegi Security ,2007年底Acegi Security正式成为Spring Portfolio项目,并更名 为Spring Security。Spring Security是一个能够为基于Spring的企 业应用系统提供描述性安全访问控制解决方案的安全框架。它提供了 一组可以在Spring应用上下文中配置的Bean,充分利用了Spring IoC(依赖注入,也称控制反转)和AOP(面向切面编程)功能,为 应用系统提供声明式的安全访问控制功能,减少了为企业系统安全控 制编写大量重复代码的工作。
LogoutFilter
• 只处理注销请求,默认为/j_spring_security_logout。 • 用途是在用户发送注销请求时,销毁用户session,清空
SecurityContextHolder,然后重定向到注销成功页面。可以与 rememberMe之类的机制结合,在注销的同时清空用户cookie。
• /j_spring_security_check,提交登陆信息的URL地址。自定义form 时,要把form的action设置为/j_spring_security_check。注意这里 要使用绝对路径,避免登陆页面存放的页面可能带来的问题 。 j_username,输入登陆名的参数名称。 j_password,输入密码的 参数名称 _spring_security_remember_me,选择是否允许自动登录 的参数名称。可以直接把这个参数设置为一个checkbox,无需设置 value,Spring Security会自行判断它是否被选中。

spring-3.1.0中文版api帮助文档

spring-3.1.0中文版api帮助文档

Spring 3.x权威开发指南:实施Java EE 6的利器2011年8月31日目录序 (VIII)前言 (X)1借助Spring 3.1实施Java EE 6 (1)1.1Java EE 6编程模型讨论 (1)1.1.1Java EE 6够敏捷,No! (1)1.1.2盘旋于具体与抽象之间 (2)1.2挖掘Spring 3.1的架构价值 (3)1.2.1精耕细作于Java EE 6平台 (3)1.2.2面向Spring的SpringSource Tool Suite集成开发工具 (3)1.2.3全面拥抱OSGi 4.2 (4)1.2.4开发者决定一切 (4)1.3下载及构建Spring 3.1 (5)1.3.1下载Spring 3.1正式发布版 (5)1.3.2基于SVN库持续构建Spring源码 (6)1.4小结 (7)2控制反转容器 (8)2.1DI及Spring DI概述 (8)2.1.1面向Java ME/Java SE的BeanFactory (8)2.1.2面向Java EE的ApplicationContext (9)2.2多种依赖注入方式 (9)2.2.1设值注入 (9)2.2.2构建器注入 (11)2.2.3属性注入 (12)2.2.4方法注入 (12)2.3借助Autowiring策略智能注入协作者 (13)2.3.1<bean/>元素的autowire属性 (13)2.3.2基于@Required注解加强协作者管理 (14)2.3.3基于@Autowired或@Inject注解的另一Autowiring策略 (16)2.3.4借助primary属性或@Qualifier注解细粒度控制Autowiring策略 (16)2.4资源操控 (19)2.5将DI容器宿主到Web容器中 (19)2.6外在化配置应用参数 (19)2.7Spring受管Bean的作用范围 (19)2.8Bean Validation集成支持 (19)2.9回调接口集合及触发顺序 (19)2.10<util/>命名空间 (20)2.11值得重视的若干DI特性 (20)2.11.1depends-on属性 (20)2.11.2别名(Alias) (20)2.11.3工厂Bean和工厂方法 (20)2.11.4<p/>命名空间 (21)2.11.5抽象和子Bean (21)2.12基于注解(Annotation)方式配置DI容器 (21)2.13Spring表达式语言(SpEL)支持 (22)2.13.1核心接口及类 (22)2.13.2基于API方式使用 (22)2.13.3基于XML方式使用 (22)2.13.4基于Annotation注解使用 (22)2.13.5SpEL语法速查 (22)2.14回调接口集合及其触发顺序 (22)2.14.1BeanNameAware回调接口 (22)2.14.2BeanClassLoaderAware回调接口 (23)2.14.3BeanFactoryAware回调接口 (23)2.14.4ResourceLoaderAware回调接口 (23)2.14.5ApplicationEventPublisherAware回调接口 (23)2.14.6MessageSourceAware回调接口 (23)2.14.7ApplicationContextAware回调接口 (23)2.14.8@PostConstruct注解 (23)2.14.9InitializingBean回调接口 (23)2.14.10<bean/>元素的init-method属性 (24)2.14.11@PreDestroy注解 (24)2.14.12DisposableBean回调接口 (24)2.14.13<bean/>元素的destroy-method属性 (24)2.15小结 (24)3面向切面编程 (25)3.1AOP及Spring AOP基础 (25)3.1.1细说AOP (25)3.1.2Spring AOP基础概念 (25)3.2AspectJ 6初探 (25)3.3老式Spring AOP (25)3.4基于@AspectJ的Spring AOP (26)3.5基于<aop:config/>元素的AOP (26)3.5.1巧用<aop:include/>元素 (26)3.6在AspectJ 6应用中启用@Configurable注解 (26)3.6.1显式使用AnnotationBeanConfigurerAspect切面 (26)3.6.2阐述@Configurable注解 (28)3.6.3通过META-INF/aop.xml(或aop-ajc.xml)控制启用的切面集合 (30)3.6.4<context:spring-configured/>元素 (31)3.6.5初探<context:load-time-weaver/>元素 (31)3.7小结 (31)4DAO层集成支持 (33)4.1RDBMS持久化操作抽象支持 (33)4.2.1JDBC最佳实践 (33)4.3事务集成支持 (33)4.4集成测试支持 (33)4.5在AspectJ 6应用中启用@Transactional注解 (33)4.6小结 (33)5Hibernate、JPA集成 (34)5.1Hibernate集成支持 (34)5.2JPA集成支持 (34)5.3智能处理Java EE容器中的装载期织入(LTW) (34)5.4小结 (35)6O/X Mapping集成支持 (36)6.1O/X Mapping集成支持 (36)6.1.1Marshaller及Unmarshaller接口 (37)6.2实践XMLBeans集成支持 (37)6.2.1借助Ant生成XMLBeans JAR (38)6.2.2XmlBeansMarshaller实现类 (39)6.2.3<oxm:xmlbeans-marshaller/>元素 (40)6.3小结 (40)7集成Java EE其他容器服务 (41)7.1简化JNDI操作 (41)7.2集成EJB 3.1 (41)7.3线程池及任务调度集成支持 (41)7.4集成JMS (41)7.5集成JavaMail (41)7.6集成分布式操作 (41)7.7集成JMX (42)7.8集成Java EE连接器架构 (42)8Web层集成支持 (43)8.1Spring Web MVC框架 (43)8.2Spring Portlet MVC框架 (43)8.3REST架构风格 (43)8.4小结 (43)9高级Spring 3.0特性 (44)9.1优雅销毁DI容器 (44)9.2小结 (44)10附录A:安装及使用SpringSource Tool Suite (45)10.1获得SpringSource Tool Suite (45)10.2安装SpringSource Tool Suite (45)10.3使用SpringSource Tool Suite (47)10.3.1针对Spring 3.1的支持 (47)10.3.2针对Spring Web Flow的支持 (49)10.3.3针对Spring Batch的支持 (50)10.3.4针对Spring Roo的支持 (50)11附录B:Spring 3.1内置的命名空间 (51)11.1<beans/>命名空间 (51)11.2<context/>命名空间 (51)11.3<util/>命名空间 (51)12附录C:Spring Web Services (52)12.1文档驱动的Web服务 (52)12.2面向OXM的Web服务实现策略 (52)12.3Web服务安全 (52)13附录D:Spring Web Flow (53)13.2探索Spring Web Flow (53)14附录E:Spring BlazeDS Integration (54)14.1Flex-RIA王者 (54)14.2简化BlazeDS的使用 (54)14.3深入到Spring BlazeDS Integration中 (54)15附录F:Spring Roo (55)15.1快速研发之道 (55)15.1.1Spring Roo概述 (55)15.2Spring Roo架构哲学 (55)15.3深入到Spring Roo中 (55)16附录G:相关资料 (56)16.1图书 (56)16.2网站 (56)序从2003年开始,开源Spring一直在同Java EE携手走来。

SpringSecurity原理

SpringSecurity原理

spring security原理使用众多的拦截器对url拦截,以此来管理权限,是spring security核心思想。

对Web资源的保护,就是靠Filter实现的。

如下图:一般来说,我们的Filter都是配置在web.xml中,但是spring security不一样,它在web.xml中配置的只是一个代理,而真正起作用的Filter是作为Bean配置在Spring中的。

web.xml中的代理依次调用这些Bean,就实现了对Web资源的保护,同时这些Filter 作为Bean被Spring管理,所以实现AOP也很简单,真的是一举两得啊。

spring security中提供的Filter不少,有十多个,一个一个学起来比较复杂。

但是对于我们Web开发者来说,常用的就那么几个,如下图中的被红圈圈标记出来的:从上到下,它们实现的功能依次是1、制定必须为https连接;2、从Session中提取用户的认证信息;3、退出登录;4、登录;5、记住用户;6、所有的应用必须配置这个Filter。

一般来说,我们写Web应用只需要熟悉这几个Filter就可以了,如果不需要https连接,连第一个也不用熟悉。

但是有人肯定会想,这些Filter怎么和我的数据库联系起来呢?不用着急,这些Filter并不直接处理用户的认证,也不直接处理用户的授权,而是把它们交给了认证管理器和决策管理器。

如下图:对于这两种管理器,那也是不需要我们写代码的,spring security也提供了现成的类。

那么大家又奇怪了:又是现成的,那怎么和我的数据库关联起来呢?别着急,其实这两个管理器自己也不做事,认证管理器把任务交给了Provider,而决策管理器则把任务交给了Voter,如下图:现在我要告诉你们,这里的Provider和Voter也是不需要我们写代码的。

不要崩溃,快到目标了。

spring security提供了多个Provider的实现类,如果我们想用数据库来储存用户的认证数据,那么我们就选择DaoAuthenticationProvider。

SpringSecurity培训

SpringSecurity培训
<intercept-url pattern="/" access="IS_AUTHENTICATED_ANONYMOUSLY" />
<intercept-url pattern="/admin.jsp" access="ROLE_ADMIN" /> <intercept-url pattern="/**" access="ROLE_USER" /> </http> • 设置成 ROLE_ANONYMOUS 也可以。
• <form action="${pageContext.request.contextPath}/j_spring_security_check" style="width:260px;text-align:center;"> <fieldset> <legend>登陆</legend> 用户: <input type="text" name="j_username" style="width:150px;" value="${sessionScope['SPRING_SECURITY_LAST_USERNAME']}"/><br /> 密码: <input type="password" name="j_password" style="width:150px;" /><br /> <input type="checkbox" name="_spring_security_remember_me" />两周之内不必登陆 <br /> <input type="submit" value="登陆"/> <input type="reset" value="重置"/> </fieldset> </form>

spring_security3入门教程

spring_security3入门教程

Spring Security 3.x 完整入门教程作者:未知文章来源:网络点击数:353 更新时间:2010-7-15Spring Security 3.x 出来一段时间了,跟Acegi是大不同了,与2.x的版本也有一些小小的区别,网上有一些文档,也有人翻译Spring Security 3.x的guide,但通过阅读guide,无法马上就能很容易的实现一个完整的实例。

我花了点儿时间,根据以前的实战经验,整理了一份完整的入门教程,供需要的朋友们参考。

1,建一个web project,并导入所有需要的lib,这步就不多讲了。

2,配置web.xml,使用Spring的机制装载:<?xml version="1.0" encoding="UTF-8"?><web-app version="2.4" xmlns="/xml/ns/j2ee"xmlns:xsi="/2001/XMLSchema-instance"xsi:schemaLocation="/xml/ns/j2ee/xml/ns/j2ee/web-app_2_4.xsd"><context-param><param-name>contextConfigLocation</param-name><param-value>classpath:applicationContext*.xml</param-value></context-param><listener><listener-class>org.springframework.web.context.ContextLoaderListener</listener-class></listener><filter><filter-name>springSecurityFilterChain</filter-name><filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class></filter><filter-mapping><filter-name>springSecurityFilterChain</filter-name><url-pattern>/*</url-pattern></filter-mapping><welcome-file-list><welcome-file>login.jsp</welcome-file></welcome-file-list></web-app>这个文件中的内容我相信大家都很熟悉了,不再多说了。

SpringSecurity入门详解

SpringSecurity入门详解

SpringSecurity⼊门详解序:本⽂主要参考 spring实战 对⾥⾯的知识做⼀个梳理1.Spring Security介绍Spring Security是基于spring的应⽤程序提供声明式安全保护的安全性框架,它提供了完整的安全性解决⽅案,能够在web请求级别和⽅法调⽤级别处理⾝份证验证和授权.它充分使⽤了依赖注⼊和⾯向切⾯的技术. Spring security主要是从两个⽅⾯解决安全性问题:1. web请求级别:使⽤servlet过滤器保护web请求并限制URL级别的访问2. ⽅法调⽤级别:使⽤Spring AOP保护⽅法调⽤,确保具有适当权限的⽤户采⽤访问安全保护的⽅法.2.Web请求级别的保护 对于请求级别的安全性来说,主要时通过保护⼀个或多个URL,使得只有特定的⽤户才能访问,并其他⽤户访问该URL的内容.本⽂主要是基于spring mvc下整合Spring security模块.2.1 声明代理Servlet过滤器 在web中的URL的⼀般需要过滤器进⾏保护,所以需要借助⼀系列的Servlet过滤器提供各种各样的安全性功能.这也需要在web.xml中配置⼀系列相关的<filter>,使得配置⽂件臃肿难以阅读.所以Spring security提供了代理Servelt过滤器可以解决该问题.如下⾯清单所⽰:<filter><filter-name>springSecurityFilterChain</filter-name><filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class></filter>DelegatingFilterProxy是⼀个代理的Servelt过滤器,它主要负责将⼯作委托给⼀个javax.servlet.Filter实现类,这个实现类作为⼀个<bean>已经注册在Spring应⽤的上下⽂,且该bean的Id便是上⾯<filter-name>的名字,即springSecurityFilterChain. springSecurityFilterChain,也可称为FilterChainProxy.它可以链接任意多个其他的过滤器,根据这些过滤器提供不同的安全特性.但是你并不需要在spring配置⽂件中配置该过滤器的bean和它所链接的其他过滤器.2.2 配置最⼩化web安全性和拦截请求<http auto-config="true"><intercept-url pattern="/admin/**" access="ROLE_ADMIN"/></http>在spring的配置⽂件中加⼊这段代码可以拦截站点/admin分⽀⾏下的所有URL请求.并限制只有具备"ROLE_ADMIN"权限的⽤户才可以访问,"ROLE_ADMIN"是⾃定义的⼀个权限.pattern默认使⽤的是Ant格式。

4、Spring Security 安全权限管理手册

4、Spring Security 安全权限管理手册

Spring Security 3.0 安全权限管理手册参考文献:1、中的spring security权限管理手册。

2、spring security3.0权限管理手册3、spring的相关资料。

本文档内容仅仅作为公司权限管理资料用,对于企业来说,权限管理将是系统中的非常重要的一个模块,权限的设计也是参考相关资料进行整理和补充。

系统将通过数据库进行管理用户权限。

权限管理搭建要的问题:1、区分Authentication(验证)与 Authorization(授权)验证这个用户是谁?用户身份可靠吗?授权某用户A是否可以访问资源R某用户A是否可以执行M操作某用户A是否可以对资源R执行M操作2、SS中的验证特点支持多种验证方式支持多种加密格式支持组件的扩展和替换可以本地化输出信息3、SS中的授权特点支持多种仲裁方式支持组件的扩展和替换支持对页面访问、方法访问、对象访问的授权。

4、SS核心安全实现Web安全通过配置Servlet Filter激活SS中的过滤器链实现Session一致性验证实现免登陆验证(Remember-Me验证)提供一系列标签库进行页面元素的安全控制方法安全通过AOP模式实现安全代理Web安全与方法安全均可以使用表达式语言定义访问规则5、配置SS配置Web.xml,应用安全过滤器配置Spring,验证与授权部分在web页面中获取用户身份在web页面中应用安全标签库实现方法级安全6、配置web.xml7、Spring配置文件中设置命名空间8、通过数据库验证用户身份9、完善web页面验证规则10、自定义验证配置11、本地化消息输出(国际化)根据公司项目的开发要求和集合spring security3.0功能,公司将通过数据库进行对用户身份验证和授权,系统将建立5个基础表进行对权利的管理。

第一部分数据库设计1、表设计create table pub_users(user_id varchar(32),user_account varchar(30),user_name varchar(40),user_password varchar(100),user_desc varchar(100),enabled int,issys int);alter table pub_users add constraint pk_pub_users primary key(user_id);create table pub_authorities(authority_id varchar(32),authority_name varchar(40),authority_desc varchar(100),enabled int,issys int);alter table pub_authorities add constraint pk_pub_authorities primary key(authority_id);create table pub_roles(role_id varchar(32),role_name varchar(40),role_desc varchar(100),enabled int,issys int);alter table pub_roles add constraint pk_pub_roles primary key(role_id);create table pub_resources(resource_id varchar(32),resource_name varchar(100),resource_desc varchar(100),resource_type varchar(40),resource_string varchar(200),priority int,enabled int,issys int);alter table pub_resources add constraint pk_pub_resources primary key(resource_id);create table pub_users_roles(id numeric(12,0) IDENTITY NOT NULL,user_id varchar(32),role_id varchar(32),enabled int);alter table pub_users_roles add constraint pk_pub_users_roles primary key(id); alter table pub_users_roles add constraint fk_users_roles_users foreign key(user_id) references pub_users(user_id);alter table pub_users_roles add constraint fk_users_roles_roles foreign key(role_id) references pub_roles(role_id);create table pub_roles_authorities(id numeric(12,0) IDENTITY NOT NULL,role_id varchar(32),authority_id varchar(32),enabled int);alter table pub_roles_authorities add constraint pk_pub_roles_authorities primary key(id);alter table pub_roles_authorities add constraint fk_pub_roles_authorities_authorities foreign key(authority_id) references pub_authorities(authority_id);alter table pub_roles_authorities add constraint fk_pub_roles_authorities_roles foreign key(role_id) references pub_roles(role_id);create table pub_authorities_resources(id numeric(12,0) IDENTITY NOT NULL,authority_id varchar(32),resource_id varchar(32),enabled int);alter table pub_authorities_resources add constraint pk_pub_authorities_resources primary key(id);alter table pub_authorities_resources add constraint fk_pub_authorities_resources_authorities foreign key(authority_id) references pub_authorities(authority_id);alter table pub_authorities_resources add constraint fk_pub_authorities_resources_resources foreign key(resource_id) references pub_resources(resource_id);3、E-R图如下:第二部分 WEB数据库整合提示:相关代码请参考项目模块1、将数据库表结构和Hibernate建立映射,本系统采用annotation进行对数据库进行零配置处理(请参考hibernate映射),如图。

Spring3.0 MVC 中文教程

Spring3.0 MVC 中文教程

Spring3 MVC - 3到Spring MVC框架简介Spring3 MVC框架简介Spring MVC是Spring的框架的Web组件。

它提供了丰富的功能,为建设强大的Web应用程序。

Spring MVC框架的架构,并在这样的高度可配置的方式,每一块的逻辑和功能设计。

此外Spring可以毫不费力地与其他流行的Web框架,如Struts,WebWork的,的Java Server Faces和Tapestry集成。

这意味着,你甚至可以告诉Spring使用Web框架中的任何一个。

比Spring更不紧耦合的servlet或JSP 向客户端呈现视图。

喜欢速度与其他视图技术集成,Freemarker的,Excel或PDF现在也有可能。

Spring3.0 MVC系列∙第1部分:到Spring 3.0 MVC框架简介∙第2部分:在Spring 3.0 MVC创建Hello World应用程序∙第3部分:在Spring 3.0 MVC的形式处理∙第4部分:Spring3 MVC的Tiles Support与Eclipse中的例子插件教程∙第5部分:Spring3 MVC的国际化及本地化教程与范例在Eclipse∙第6部分:Spring3 MVC示例教程Spring主题∙第7部分:创建Spring3 MVC Hibernate 3的示例在Eclipse中使用Maven的在Spring Web MVC,你可以使用任何对象作为命令或表单支持对象,你不需要实现框架特定的接口或基类。

Spring的数据绑定是高度灵活的:例如,将验证错误类型不作为应用系统错误,可以通过评估的不匹配。

因此,你不必重复你的业务对象的属性,简单的无类型的字符串,在表单对象仅仅是为了处理无效的意见,或正确转换的字符串。

相反,它往往是最好直接绑定到业务对象。

请求处理生命周期Spring的Web MVC框架是,像许多其他Web MVC框架,要求为导向,围绕一个中心的servlet,它把请求分派给控制器,提供其他功能,有利于开发Web应用而设计的。

Spring 安全管理手册

Spring 安全管理手册

Spring Security下一页Spring Security安全权限管理手册0.0.2版权 © 2009 Lingo论坛:/bbs/。

Email:xyz20003@。

QQ群:3038490。

2009-05-26 13:41:40序言I. 基础篇1. 一个简单的HelloWorld1.1. 配置过滤器1.2. 使用命名空间1.3. 完善整个项目1.4. 运行示例2. 使用数据库管理用户权限2.1. 修改配置文件2.2. 数据库表结构3. 自定义数据库表结构3.1. 自定义表结构3.2. 初始化数据3.3. 获得自定义用户权限信息3.3.1. 处理用户登陆3.3.2. 检验用户权限4. 自定义登陆页面4.1. 实现自定义登陆页面4.2. 修改配置文件4.3. 登陆页面中的参数配置4.4. 测试一下5. 使用数据库管理资源5.1. 数据库表结构5.2. 初始化数据5.3. 实现从数据库中读取资源信息5.3.1. 需要何种数据格式5.3.2. 替换原有功能的切入点6. 控制用户信息6.1. MD5加密6.2. 盐值加密6.3. 用户信息缓存6.4. 获取当前用户信息II. 保护web篇7. 图解过滤器7.1. HttpSessionContextIntegrationFilter7.2. LogoutFilter7.3. AuthenticationProcessingFilter7.4. DefaultLoginPageGeneratingFilter7.5. BasicProcessingFilter7.6. SecurityContextHolderAwareRequestFilter7.7. RememberMeProcessingFilter7.8. AnonymousProcessingFilter7.9. ExceptionTranslationFilter7.10. SessionFixationProtectionFilter7.11. FilterSecurityInterceptorIII. 保护method篇IV. ACL篇V. 最佳实践篇A. 修改日志B. 常见问题解答C. Spring Security-3.0.0.M1下一页序言序言上一页下一页序言为啥选择Spring Security欢迎阅读咱们写的Spring Security教程,咱们既不想写一个简单的入门教程,也不想翻译已有的国外教程。

SpringSecurity整合jwt权限认证的全流程讲解

SpringSecurity整合jwt权限认证的全流程讲解

SpringSecurity整合jwt权限认证的全流程讲解JWT本⽂代码截取⾃实际项⽬。

jwt(Json Web Token),⼀个token,令牌。

简单流程:⽤户登录成功后,后端返回⼀个token,也就是颁发给⽤户⼀个凭证。

之后每⼀次访问,前端都需要携带这个token,后端通过token来解析出当前访问对象。

优点1、⼀定程度上解放了后端,后端不需要再记录当前⽤户是谁,不需要再维护⼀个session,节省了开销。

2、session依赖于cookie,某些场合cookie是⽤不了的,⽐如⽤户浏览器cookie被禁⽤、移动端⽆法存储cookie等。

缺点1、既然服务器通过token就可以知道当前⽤户是谁,说明其中包含了⽤户信息,有⼀定的泄露风险。

2、因为是⽆状态的,服务器不维持会话,那么每⼀次请求都会重新去数据库读取权限信息,性能有⼀定影响。

(如果想提⾼性能,可以将权限数据存到redis,但是如果⽤redis,就已经失去了jwt的优点,直接⽤普通的token+redis即可)3、只能校验token是否正确,通过设定过期时间来确定其有效性,不可以⼿动注销。

先说怎么做,再说为什么。

代码依赖<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-security</artifactId><security.version>2.3.3.RELEASE</security.version></dependency><dependency><groupId>io.jsonwebtoken</groupId><artifactId>jjwt</artifactId><jwt.version>0.9.1</jwt.version></dependency>jwt⼯具类public class JwtTokenUtils implements Serializable {private static final long serialVersionUID = -3369436201465044824L;//⽣成tokenpublic static String createToken(String username) {return Jwts.builder().setSubject(username).setExpiration(new Date(System.currentTimeMillis()+ Constants.Jwt.EXPIRATION)).signWith(SignatureAlgorithm.HS512, Constants.Jwt.KEY).compressWith(CompressionCodecs.GZIP).compact();}//获取⽤户名public static String getUserName(String token) {return Jwts.parser().setSigningKey(Constants.Jwt.KEY).parseClaimsJws(token).getBody().getSubject();}}涉及常量public interface Constants {public interface Jwt{/*** 密钥*/String KEY = "123123";/*** 过期时间*/long EXPIRATION = 7200000;/*** 请求头*/String TOKEN_HEAD = "Authorization";}}实体类和Service为了减少对实体类的⼊侵,我⼜定义了⼀个对象原实体类/*** ⽤户信息**/@Data@TableName("tb_user_info")public class UserInfo implements Serializable {private static final long serialVersionUID = 1L;/*** 主键id*/@TableId(type = IdType.AUTO)private Integer id;/*** 登陆账号*/private String loginName;/*** 显⽰名*/private String dispName;/*** 密码*/private String password;/*** 状态,1正常,2禁⽤*/private Byte status;/*** 创建⼈*/@TableField(fill = FieldFill.INSERT)private Integer createBy;/*** 更新⼈*/@TableField(fill = FieldFill.INSERT_UPDATE)private Integer updateBy;/*** 创建时间*/@TableField(fill = FieldFill.INSERT)private Date createTime;/*** 更新时间*/@TableField(fill = FieldFill.INSERT_UPDATE)private Date updateTime;/*** 1正常, 0 删除*/@TableLogicprivate Byte deleted;}定义对象@Datapublic class UserSecurity implements UserDetails {private static final long serialVersionUID = -6777760550924505136L;private UserInfo userInfo;private List<String> permissionValues;public UserSecurity(UserInfo userInfo) {erInfo = userInfo;}@Overridepublic Collection<? extends GrantedAuthority> getAuthorities() {Collection<GrantedAuthority> authorities = new ArrayList<>();for(String permissionValue : permissionValues) {if(StringUtils.isEmpty(permissionValue)) continue;SimpleGrantedAuthority authority = new SimpleGrantedAuthority(permissionValue);authorities.add(authority);}return authorities;}@Overridepublic String getPassword() {return userInfo.getPassword();}@Overridepublic String getUsername() {return userInfo.getLoginName();}@Overridepublic boolean isAccountNonExpired() {return true;}@Overridepublic boolean isAccountNonLocked() {return true;}@Overridepublic boolean isCredentialsNonExpired() {return true;}@Overridepublic boolean isEnabled() {return true;}}service@Servicepublic class UserInfoServiceImpl implements UserInfoService, UserDetailsService {@AutowiredUserInfoMapper userInfoMapper;@AutowiredPermissionService permissionService;@Overridepublic UserDetails loadUserByUsername(String username) throws UsernameNotFoundException { QueryWrapper<UserInfo> queryWrapper = new QueryWrapper<>();queryWrapper.eq("login_name", username);UserInfo userInfo = userInfoMapper.selectOne(queryWrapper);List<String> rights = permissionService.listPermissions(username);UserSecurity userSecurity = new UserSecurity(userInfo);userSecurity.setPermissionValues(rights);return userSecurity;}}配置类@Configuration@EnableWebSecurity@EnableGlobalMethodSecurity(prePostEnabled = true)public class SecurityConfig extends WebSecurityConfigurerAdapter {@AutowiredUserInfoServiceImpl userInfoService;@AutowiredJwtAuthorizationTokenFilter jwtAuthorizationTokenFilter;@AutowiredTokenLoginFilter tokenLoginFilter;@AutowiredJwtAuthenticationEntryPoint jwtAuthenticationEntryPoint;@Autowiredpublic void configure(AuthenticationManagerBuilder auth) throws Exception {erDetailsService(userInfoService).passwordEncoder(passwordEncoderBean());}@Overrideprotected void configure(HttpSecurity http) throws Exception {http.exceptionHandling().authenticationEntryPoint(jwtAuthenticationEntryPoint).and().csrf().disable().authorizeRequests().antMatchers("/login").permitAll().antMatchers("/hello").permitAll().antMatchers("/swagger-ui.html").permitAll().antMatchers("/webjars/**").permitAll().antMatchers("/swagger-resources/**").permitAll().antMatchers("/v2/*").permitAll().antMatchers("/csrf").permitAll().antMatchers("/doc.html").permitAll().antMatchers(HttpMethod.OPTIONS, "/**").anonymous().anyRequest().authenticated().and().sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS).and().addFilterAt(tokenLoginFilter, UsernamePasswordAuthenticationFilter.class).addFilterAfter(jwtAuthorizationTokenFilter, TokenLoginFilter.class).httpBasic();}@Beanpublic PasswordEncoder passwordEncoderBean() {return new BCryptPasswordEncoder();}@Bean@Overrideprotected AuthenticationManager authenticationManager() throws Exception {return super.authenticationManager();}}过滤器⼀个负责登录⼀个负责鉴权@Componentpublic class JwtAuthorizationTokenFilter extends OncePerRequestFilter {@AutowiredPermissionService permissionService;@AutowiredUserInfoServiceImpl userDetailsService;@Overrideprotected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain chain) throws IOException, ServletException { //获取当前认证成功⽤户权限信息UsernamePasswordAuthenticationToken authRequest = getAuthentication(request);//判断如果有权限信息,放到权限上下⽂中if (authRequest != null) {SecurityContextHolder.getContext().setAuthentication(authRequest);}chain.doFilter(request, response);}private UsernamePasswordAuthenticationToken getAuthentication(HttpServletRequest request) {//从header获取tokenString token = request.getHeader(Constants.Jwt.TOKEN_HEAD);if (token != null) {//从token获取⽤户名String loginName = JwtTokenUtils.getUserName(token);//获取权限列表UserInfo userInfo = userDetailsService.selectByLoginName(loginName);List<String> permissions = permissionService.listPermissions(loginName);Collection<GrantedAuthority> authority = new ArrayList<>();for (String permissionValue : permissions) {SimpleGrantedAuthority auth = new SimpleGrantedAuthority(permissionValue);authority.add(auth);}return new UsernamePasswordAuthenticationToken(userInfo, token, authority);}return null;}}Componentpublic class TokenLoginFilter extends UsernamePasswordAuthenticationFilter {public TokenLoginFilter() {this.setPostOnly(false);this.setRequiresAuthenticationRequestMatcher(new AntPathRequestMatcher("/login","POST"));}@Overridepublic Authentication attemptAuthentication(HttpServletRequest request, HttpServletResponse response) throws AuthenticationException {//获取表单提交数据try {UserInfo user = new ObjectMapper().readValue(request.getInputStream(), UserInfo.class);UsernamePasswordAuthenticationToken authenticationToken = new UsernamePasswordAuthenticationToken(user.getLoginName(), user.getPassword(),null);return super.getAuthenticationManager().authenticate(authenticationToken);} catch (IOException e) {e.printStackTrace();throw new RuntimeException();}}@Overrideprotected void successfulAuthentication(HttpServletRequest request, HttpServletResponse response, FilterChain chain, Authentication authResult) throws IOException, ServletException { UserSecurity userSecurity = (UserSecurity) authResult.getPrincipal();String token = JwtTokenUtils.createToken(userSecurity.getUsername());ResponseUtils.out(response, R.ok(token));}@Overrideprotected void unsuccessfulAuthentication(HttpServletRequest request, HttpServletResponse response, AuthenticationException failed) throws IOException, ServletException {ResponseUtils.out(response, R.fail(ServiceError.LOGIN_FAIL));}@Autowired@Overridepublic void setAuthenticationManager(AuthenticationManager authenticationManager) {super.setAuthenticationManager(authenticationManager);}}异常处理登陆失败异常处理,⾃定义返回类型@Componentpublic class JwtAuthenticationEntryPoint implements AuthenticationEntryPoint {@Overridepublic void commence(HttpServletRequest request, HttpServletResponse response, AuthenticationException authException) throws IOException, ServletException {ResponseUtils.out(response, R.fail(ServiceError.AUTHENTICATION_FAIL));}}⾄于权限和⾓⾊,得看具体的业务,我这边就不贴出来了。

Spring_Security-3.0.1_中文官方文档(中文版高清)

Spring_Security-3.0.1_中文官方文档(中文版高清)

Spring Security-3.0.1 中文官方文档(翻译版)这次发布的Spring Security-3.0.1 是一个bug fix 版,主要是对3.0 中存在的一些问题进行修正。

文档中没有添加新功能的介绍,但是将之前拼写错误的一些类名进行了修正,建议开发者以这一版本的文档为参考。

另:Spring Security 从2010-01-01 以后,版本控制从SVN 换成了GIT,我们在翻译文档的时候,主要是根据SVN 的变化来进行文档内容的比对,这次换成GIT 后,感觉缺少了之前那种文本比对工具,如果有对GIT 熟悉的朋友,还请推荐一下文本比对的工具,谢谢。

序言I. 入门1. 介绍1.1. Spring Security 是什么?1.2. 历史1.3. 发行版本号1.4. 获得Spring Security1.4.1. 项目模块1.4.1.1. Core - spring-security-core.jar1.4.1.2. Web - spring-security-web.jar1.4.1.3. Config - spring-security-config.jar1.4.1.4. LDAP - spring-security-ldap.jar1.4.1.5. ACL - spring-security-acl.jar1.4.1.6. CAS - spring-security-cas-client.jar1.4.1.7. OpenID - spring-security-openid.jar1.4.2. 获得源代码2. Security 命名空间配置2.1. 介绍2.1.1. 命名空间的设计2.2. 开始使用安全命名空间配置2.2.1. 配置web.xml2.2.2. 最小<http> 配置2.2.2.1. auto-config 包含了什么?2.2.2.2. 表单和基本登录选项2.2.3. 使用其他认证提供器2.2.3.1. 添加一个密码编码器2.3. 高级web 特性2.3.1. Remember-Me 认证2.3.2. 添加HTTP/HTTPS 信道安全2.3.3. 会话管理2.3.3.1. 检测超时2.3.3.2. 同步会话控制2.3.3.3. 防止Session 固定攻击2.3.4. 对OpenID 的支持2.3.4.1. 属性交换2.3.5. 添加你自己的filter2.3.5.1. 设置自定义AuthenticationEntryPoint2.4. 保护方法2.4.1. <global-method-security> 元素2.4.1.1. 使用protect-pointcut 添加安全切点2.5. 默认的AccessDecisionManager2.5.1. 自定义AccessDecisionManager2.6. 验证管理器和命名空间3. 示例程序3.1. Tutorial 示例3.2. Contacts3.3. LDAP 例子3.4. CAS 例子3.5. Pre-Authentication 例子4. Spring Security 社区4.1. 任务跟踪4.2. 成为参与者4.3. 更多信息II. 结构和实现5. 技术概述5.1. 运行环境5.2. 核心组件5.2.1. SecurityContextHolder, SecurityContext 和Authentication 对象5.2.1.1. 获得当前用户的信息5.2.2. UserDetailsService5.2.3. GrantedAuthority5.2.4. 小结5.3. 验证5.3.1. 什么是Spring Security 的验证呢?5.3.2. 直接设置SecurityContextHolder 的内容5.4. 在web 应用中验证5.4.1. ExceptionTranslationFilter5.4.2. AuthenticationEntryPoint5.4.3. 验证机制5.4.4. 在请求之间保存SecurityContext 。

SpringSecurity3.1中功能强大的加密工具PasswordEncoder

SpringSecurity3.1中功能强大的加密工具PasswordEncoder

SpringSecurity3.1中功能强大的加密工具PasswordEncoder去年发生的密码泄漏事件,我们也对密码加密做了重新研究。

在筛选加密方法的过程中,发现了Spring Security 3.1.0版本中提供了新的PasswordEncoder,它的加密方法非常给力!虽然ns同学曾经说过“你的网站看起来很安全, 只是因为人家没精力或者没兴趣搞你...”,但是找到一个好的加密方法,无疑还是会有很大帮助的,至少会延迟破解的时间说到PasswordEncoder,使用过Spring Security的人应该不会陌生。

在 3.1.0版本之前,位于org.springframework.security.authentication.encoding包中,辅以一系列的实现类,每个实现类使用了不同的加密方法,有Md4PasswordEncoder、Md5PasswordEncoder、ShaPasswordEncoder、PlaintextPasswordEncoder等。

加密方法采用hash+salt方式。

3.0.0版本中PasswordEncoder继承关系在3.1.0及之后的版本,增加了crypto包/模块,提供了更加强大的对称加密,生成key,以及密码加密功能。

这个模块是作为core的一部分存在的,但是对其它任何Spring Security或Spring代码没有依赖,也可以单独作为一个包存在!3.1.0版本中新的PasswordEncoder继承关系在3.1.0以前的版本中,PasswordEncoder位于org.springframeword.security.authentication.encoding包中,接口定义如下:在具体加密过程中,可以动态选择各种实现类(其实就是各种加密算法),配合salt来进行加密和验证工作。

缺点就是每次加密和解密都得提供盐值,那么有两种方式,一是将盐值和密码存在一起,一是使用固定的盐值。

详解SpringSecurity中的Authentication信息与登录流程

详解SpringSecurity中的Authentication信息与登录流程

详解SpringSecurity中的Authentication信息与登录流程Authentication使⽤SpringSecurity可以在任何地⽅注⼊Authentication进⽽获取到当前登录的⽤户信息,可谓⼗分强⼤。

在Authenticaiton的继承体系中,实现类UsernamePasswordAuthenticationToken 算是⽐较常见的⼀个了,在这个类中存在两个属性:principal和credentials,其实分别代表着⽤户和密码。

【当然其他的属性存在于其⽗类中,如authorities和details。

】我们需要对这个对象有⼀个基本地认识,它保存了⽤户的基本信息。

⽤户在登录的时候,进⾏了⼀系列的操作,将信息存与这个对象中,后续我们使⽤的时候,就可以轻松地获取这些信息了。

那么,⽤户信息如何存,⼜是如何取的呢?继续往下看吧。

登录流程⼀、与认证相关的UsernamePasswordAuthenticationFilter通过Servlet中的Filter技术进⾏实现,通过⼀系列内置的或⾃定义的安全Filter,实现接⼝的认证与授权。

⽐如:UsernamePasswordAuthenticationFilterpublic Authentication attemptAuthentication(HttpServletRequest request,HttpServletResponse response) throws AuthenticationException {if (postOnly && !request.getMethod().equals("POST")) {throw new AuthenticationServiceException("Authentication method not supported: " + request.getMethod());}//获取⽤户名和密码String username = obtainUsername(request);String password = obtainPassword(request);if (username == null) {username = "";}if (password == null) {password = "";}username = username.trim();//构造UsernamePasswordAuthenticationToken对象UsernamePasswordAuthenticationToken authRequest = new UsernamePasswordAuthenticationToken(username, password);// 为details属性赋值setDetails(request, authRequest);// 调⽤authenticate⽅法进⾏校验return this.getAuthenticationManager().authenticate(authRequest);}获取⽤户名和密码从request中提取参数,这也是SpringSecurity默认的表单登录需要通过key/value形式传递参数的原因。

Spring Security-3.0.1 中文官方文档(翻译版)

Spring Security-3.0.1 中文官方文档(翻译版)

Spring Security-3.0.1 中文官方文档(翻译版)这次发布的Spring Security-3.0.1 是一个bug fix 版,主要是对3.0 中存在的一些问题进行修正。

文档中没有添加新功能的介绍,但是将之前拼写错误的一些类名进行了修正,建议开发者以这一版本的文档为参考。

另:Spring Security 从2010-01-01 以后,版本控制从SVN 换成了GIT,我们在翻译文档的时候,主要是根据SVN 的变化来进行文档内容的比对,这次换成GIT 后,感觉缺少了之前那种文本比对工具,如果有对GIT 熟悉的朋友,还请推荐一下文本比对的工具,谢谢。

序言I. 入门1. 介绍1.1. Spring Security 是什么?1.2. 历史1.3. 发行版本号1.4. 获得Spring Security1.4.1. 项目模块1.4.1.1. Core - spring-security-core.jar1.4.1.2. Web - spring-security-web.jar1.4.1.3. Config - spring-security-config.jar1.4.1.4. LDAP - spring-security-ldap.jar1.4.1.5. ACL - spring-security-acl.jar1.4.1.6. CAS - spring-security-cas-client.jar1.4.1.7. OpenID - spring-security-openid.jar1.4.2. 获得源代码2. Security 命名空间配置2.1. 介绍2.1.1. 命名空间的设计2.2. 开始使用安全命名空间配置2.2.1. 配置web.xml2.2.2. 最小<http> 配置2.2.2.1. auto-config 包含了什么?2.2.2.2. 表单和基本登录选项2.2.3. 使用其他认证提供器2.2.3.1. 添加一个密码编码器2.3. 高级web 特性2.3.1. Remember-Me 认证2.3.2. 添加HTTP/HTTPS 信道安全2.3.3. 会话管理2.3.3.1. 检测超时2.3.3.2. 同步会话控制2.3.3.3. 防止Session 固定攻击2.3.4. 对OpenID 的支持2.3.4.1. 属性交换2.3.5. 添加你自己的filter2.3.5.1. 设置自定义AuthenticationEntryPoint2.4. 保护方法2.4.1. <global-method-security> 元素2.4.1.1. 使用protect-pointcut 添加安全切点2.5. 默认的AccessDecisionManager2.5.1. 自定义AccessDecisionManager2.6. 验证管理器和命名空间3. 示例程序3.1. Tutorial 示例3.2. Contacts3.3. LDAP 例子3.4. CAS 例子3.5. Pre-Authentication 例子4. Spring Security 社区4.1. 任务跟踪4.2. 成为参与者4.3. 更多信息II. 结构和实现5. 技术概述5.1. 运行环境5.2. 核心组件5.2.1. SecurityContextHolder, SecurityContext 和Authentication 对象5.2.1.1. 获得当前用户的信息5.2.2. UserDetailsService5.2.3. GrantedAuthority5.2.4. 小结5.3. 验证5.3.1. 什么是Spring Security 的验证呢?5.3.2. 直接设置SecurityContextHolder 的内容5.4. 在web 应用中验证5.4.1. ExceptionTranslationFilter5.4.2. AuthenticationEntryPoint5.4.3. 验证机制5.4.4. 在请求之间保存SecurityContext 。

Spring Security 5.1 中文 参考手册 中文文档

Spring Security 5.1  中文 参考手册 中文文档
人们使用Spring Security有很多原因,但是大多数人在找到Java EE的Servlet规范或EJB规范的安全特性后,都缺乏典型企业应用场景所需的深度。 在提到这些标准的同 时,认识到它们在WAR或EAR级别不可移植是很重要的。 因此,如果切换服务器环境,在新的目标环境中重新配置应用程序的安全性通常需要很多工作。 使用Spring
VPN或IP安全性来确保只有经过授权的系统才能尝试连接。 在企业环境中,您可以部署一个DMZ,将面向公众的服务器与后端数据库和应用程序服务器分开。 您的操作系
统也将扮演重要角色,解决诸如以无特权用户身份运行进程等问题并最大限度提高文件系统安全性。 操作系统通常也会配置自己的防火墙。 希望在这个过程中的某个地方 你会试图阻止对系统的拒绝服务和暴力攻击。 入侵检测系统对于监视和响应攻击也特别有用,因为这些系统能够采取保护措施,例如实时阻止侵入TCP / IP地址。 转移到 更高层,您的Java虚拟机将有望配置为最大限度地减少授予不同Java类型的权限,然后您的应用程序将添加自己的问题特定于域的安全配置。 Spring Security使后面的这个 领域 - 应用程序的安全性更容易。 当然,您需要正确处理上面提到的所有安全层,以及包含每个层的管理因素。 这些管理因素的非详尽清单将包括安全公告监控,修补,人员审查,审计,变更控制,工程 管理系统,数据备份,灾难恢复,性能基准测试,负载监控,集中式日志记录,事件响应程序等。 由于Spring Security专注于帮助企业应用程序安全层,因此您会发现有多少不同的需求与业务问题域相同。 银行应用程序对电子商务应用程序有不同的需求。 电子商务应 用程序对企业销售人员自动化工具有不同的需求。 这些自定义要求使应用程序安全性变得有趣,富有挑战性和有益。 请首先阅读Chapter 1, Getting Started的全部内容。 这将向您介绍框架和基于命名空间的配置系统,您可以使用该系统快速启动和运行。 为了更好地理解Spring Security的 工作原理以及您可能需要使用的一些类,请阅读Part II, “Architecture and Implementation” 。 本指南的其余部分采用更传统的参考样式,旨在根据需要进行阅读。 我们还建 议您尽可能多地阅读应用程序安全问题。 Spring Security不是解决所有安全问题的万能药。 从一开始,应用程序的设计就要考虑到安全性,这一点很重要。 试图改造它并 不是一个好主意。 特别是,如果您正在构建Web应用程序,则应该意识到许多潜在的漏洞,例如跨站脚本,请求伪造和会话劫持,您应该从一开始就考虑这些漏洞。

SpringSecurity入门教程通俗易懂超详细【内含案例】

SpringSecurity入门教程通俗易懂超详细【内含案例】

SpringSecurity⼊门教程通俗易懂超详细【内含案例】Spring Security的简单使⽤推荐简介SSM 整合 Security 是⽐较⿇烦的,虽然Security的功能⽐ Shiro 强⼤,相反却没有Shiro的使⽤量多SpringBoot出现后简化了Spring系列的配置⽂件,因此SpringSecurity的使⽤逐渐增加⼀、创建项⽬在 SpringBoot 中直接引⼊ Spring Security 依赖即可创建项⽬的启动类创建 SecurityController 类启动后访问 localhost:8080/hello会⾃动跳到 localhost:8080/login需要登录后才能访问 /hello⼆、⽤户名配置默认情况下⽤户名是 user ,⽽密码会在项⽬启动时控制台打印出⼀串随机字符串,这就是密码.每次启动项⽬,密码都不⼀样对登录的⽤户名/密码进⾏配置,有三种不同的⽅式在 application 配置⽂件中声明在 java 代码配置在内存⾥通过获取数据库第⼀种⽅式 application.yml ⽂件中第⼆种⽅式创建⼀个SecurityConfig配置类,继承 WebSecurityConfigurerAdapter第三种⽅法没有进⾏演⽰,就是在数据库中取出username和password配置到内存中三、忽略拦截在配置类中重写 configure(WebSecurity web) ⽅法,然后直接访问即可pom.xml⽂件<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-security</artifactId></dependency><!--Web项⽬需引⼊web依赖--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency>启动类⽂件import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;/*** @author https:///beixuan/*/@SpringBootApplicationpublic class SecurityApplication {public static void main(String[] args) {SpringApplication.run(SecurityApplication.class, args);}}SecurityController ⽂件import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RestController;/*** @author https:///beixuan/*/@RestControllerpublic class SecurityController {/*** 不⽤登录就可访问* @return*/@RequestMapping("/hi")public String sayHi(){return "Hi bro!";}@RequestMapping("/hello")public String sayHello(){return "Hello bro!";}}application.yml 配置⽂件spring:security:user:name: beixuanpassword: beixuanSecurityConfig Java配置⽂件此⽅法配置⽤户与配置 yml ⽂件效果⼀致import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;import org.springframework.security.config.annotation.web.builders.WebSecurity;import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;import org.springframework.security.crypto.password.PasswordEncoder;/*** @author https:///beixuan/*/@Configurationpublic class SecurityConfig extends WebSecurityConfigurerAdapter {@Overridepublic void configure(AuthenticationManagerBuilder auth) throws Exception {//Spring Security5之后官⽅需要密码强制加密,如不想加密可创建⼀个过期的 PasswordEncoder 的实例 NoOpPasswordEncoder,但不安全 BCryptPasswordEncoder bCryptPasswordEncoder = new BCryptPasswordEncoder();String password = bCryptPasswordEncoder.encode("beixuan");//添加⼀个⽤户[beixuan] ⾓⾊为[admin] 密码是[beixuan加密后的密钥]auth.inMemoryAuthentication().withUser("beixuan").roles("admin").password(password);}@BeanPasswordEncoder passwordEncoder(){return new BCryptPasswordEncoder();}}具体的登录配置下⾯代码借鉴于随笔的代码,有兴趣可以看看VerifyCodeFilter ⼀次性验证码,可以查看资料了解其使⽤⽅法,这⾥不再叙述@Configurationpublic class SecurityConfig extends WebSecurityConfigurerAdapter {@AutowiredVerifyCodeFilter verifyCodeFilter;@Overrideprotected void configure(HttpSecurity http) throws Exception {http.addFilterBefore(verifyCodeFilter, UsernamePasswordAuthenticationFilter.class);http.authorizeRequests()//开启登录配置.antMatchers("/hello").hasRole("admin")//表⽰访问 /hello 这个接⼝,需要具备 admin 这个⾓⾊.anyRequest().authenticated()//表⽰剩余的其他接⼝,登录之后就能访问.and().formLogin()//定义登录页⾯,未登录时,访问⼀个需要登录之后才能访问的接⼝,会⾃动跳转到该页⾯.loginPage("/login_p")//登录处理接⼝.loginProcessingUrl("/doLogin")//定义登录时,⽤户名的 key,默认为 username.usernameParameter("uname")//定义登录时,⽤户密码的 key,默认为 password.passwordParameter("passwd")//登录成功的处理器.successHandler(new AuthenticationSuccessHandler() {@Overridepublic void onAuthenticationSuccess(HttpServletRequest req, HttpServletResponse resp, Authentication authentication) throws IOException, ServletException { resp.setContentType("application/json;charset=utf-8");PrintWriter out = resp.getWriter();out.write("success");out.flush();}}).failureHandler(new AuthenticationFailureHandler() {@Overridepublic void onAuthenticationFailure(HttpServletRequest req, HttpServletResponse resp, AuthenticationException exception) throws IOException, ServletException { resp.setContentType("application/json;charset=utf-8");PrintWriter out = resp.getWriter();out.write("fail");out.flush();}}).permitAll()//和表单登录相关的接⼝统统都直接通过.and().logout().logoutUrl("/logout").logoutSuccessHandler(new LogoutSuccessHandler() {@Overridepublic void onLogoutSuccess(HttpServletRequest req, HttpServletResponse resp, Authentication authentication) throws IOException, ServletException { resp.setContentType("application/json;charset=utf-8");PrintWriter out = resp.getWriter();out.write("logout success");out.flush();}}).permitAll().and().httpBasic().and().csrf().disable();}忽略拦截分两步增加访问路径/hi/*** 不⽤登录就可访问* @return*/@RequestMapping("/hi")public String sayHi(){return "Hi bro!";}增加配置代码@Overridepublic void configure(WebSecurity web) throws Exception {web.ignoring().antMatchers("/hi");}即可不⽤登录访问/hi路径END本⽂就先说到这⾥,有问题欢迎留⾔讨论。

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

Spring Security-3.0.1 中文官方文档(翻译版)这次发布的Spring Security-3.0.1 是一个bug fix 版,主要是对3.0 中存在的一些问题进行修正。

文档中没有添加新功能的介绍,但是将之前拼写错误的一些类名进行了修正,建议开发者以这一版本的文档为参考。

另:Spring Security 从2010-01-01 以后,版本控制从SVN 换成了GIT,我们在翻译文档的时候,主要是根据SVN 的变化来进行文档内容的比对,这次换成GIT 后,感觉缺少了之前那种文本比对工具,如果有对GIT 熟悉的朋友,还请推荐一下文本比对的工具,谢谢。

序言I. 入门1. 介绍1.1. Spring Security 是什么?1.2. 历史1.3. 发行版本号1.4. 获得Spring Security1.4.1. 项目模块1.4.1.1. Core - spring-security-core.jar1.4.1.2. Web - spring-security-web.jar1.4.1.3. Config - spring-security-config.jar1.4.1.4. LDAP - spring-security-ldap.jar1.4.1.5. ACL - spring-security-acl.jar1.4.1.6. CAS - spring-security-cas-client.jar1.4.1.7. OpenID - spring-security-openid.jar1.4.2. 获得源代码2. Security 命名空间配置2.1. 介绍2.1.1. 命名空间的设计2.2. 开始使用安全命名空间配置2.2.1. 配置web.xml2.2.2. 最小<http> 配置2.2.2.1. auto-config 包含了什么?2.2.2.2. 表单和基本登录选项2.2.3. 使用其他认证提供器2.2.3.1. 添加一个密码编码器2.3. 高级web 特性2.3.1. Remember-Me 认证2.3.2. 添加HTTP/HTTPS 信道安全2.3.3. 会话管理2.3.3.1. 检测超时2.3.3.2. 同步会话控制2.3.3.3. 防止Session 固定攻击2.3.4. 对OpenID 的支持2.3.4.1. 属性交换2.3.5. 添加你自己的filter2.3.5.1. 设置自定义AuthenticationEntryPoint2.4. 保护方法2.4.1. <global-method-security> 元素2.4.1.1. 使用protect-pointcut 添加安全切点2.5. 默认的AccessDecisionManager2.5.1. 自定义AccessDecisionManager2.6. 验证管理器和命名空间3. 示例程序3.1. Tutorial 示例3.2. Contacts3.3. LDAP 例子3.4. CAS 例子3.5. Pre-Authentication 例子4. Spring Security 社区4.1. 任务跟踪4.2. 成为参与者4.3. 更多信息II. 结构和实现5. 技术概述5.1. 运行环境5.2. 核心组件5.2.1. SecurityContextHolder, SecurityContext 和Authentication 对象5.2.1.1. 获得当前用户的信息5.2.2. UserDetailsService5.2.3. GrantedAuthority5.2.4. 小结5.3. 验证5.3.1. 什么是Spring Security 的验证呢?5.3.2. 直接设置SecurityContextHolder 的内容5.4. 在web 应用中验证5.4.1. ExceptionTranslationFilter5.4.2. AuthenticationEntryPoint5.4.3. 验证机制5.4.4. 在请求之间保存SecurityContext 。

5.5. Spring Security 中的访问控制(验证)5.5.1. 安全和AOP 建议5.5.2. 安全对象和AbstractSecurityInterceptor5.5.2.1. 配置属性是什么?5.5.2.2. RunAsManager5.5.2.3. AfterInvocationManager5.5.2.4. 扩展安全对象模型5.6. 国际化6. 核心服务6.1. The AuthenticationManager , ProviderManager 和AuthenticationProvider s 6.1.1. DaoAuthenticationProvider6.2. UserDetailsService 实现6.2.1. 内存认证6.2.2. JdbcDaoImpl6.2.2.1. 权限分组6.3. 密码加密6.3.1. 什么是散列加密?6.3.2. 为散列加点儿盐6.3.3. 散列和认证III. web 应用安全7. 安全过滤器链7.1. DelegatingFilterProxy7.2. FilterChainProxy7.2.1. 绕过过滤器链7.3. 过滤器顺序7.4. 使用其他过滤器——基于框架8. 核心安全过滤器8.1. FilterSecurityInterceptor8.2. ExceptionTranslationFilter8.2.1. AuthenticationEntryPoint8.2.2. AccessDeniedHandler8.3. SecurityContextPersistenceFilter8.3.1. SecurityContextRepository8.4. UsernamePasswordAuthenticationFilter8.4.1. 认证成功和失败的应用流程9. Basic(基本)和Digest(摘要)验证9.1. BasicAuthenticationFilter9.1.1. 配置9.2. DigestAuthenticationFilter9.2.1. Configuration10. Remember-Me 认证10.1. 概述10.2. 简单基于散列标记的方法10.3. 持久化标记方法10.4. Remember-Me 接口和实现10.4.1. TokenBasedRememberMeServices10.4.2. PersistentTokenBasedRememberMeServices11. 会话管理11.1. SessionManagementFilter11.2. SessionAuthenticationStrategy11.3. 同步会话12. 匿名认证12.1. 概述12.2. 配置12.3. AuthenticationTrustResolverIV. 授权13. 验证架构13.1. 验证13.2. 处理预调用13.2.1. AccessDecisionManager13.2.2. 基于投票的AccessDecisionManager 实现13.2.2.1. RoleVoter13.2.2.2. AuthenticatedVoter13.2.2.3. Custom Voters13.3. 处理后决定14. 安全对象实现14.1. AOP 联盟(MethodInvocation) 安全拦截器14.1.1. 精确的MethodSecurityIterceptor 配置14.2. AspectJ (JoinPoint) 安全拦截器15. 基于表达式的权限控制15.1. 概述15.1.1. 常用内建表达式15.2. Web 安全表达式15.3. 方法安全表达式15.3.1. @Pre 和@Post 注解15.3.1.1. 访问控制使用@PreAuthorize 和@PostAuthorize15.3.1.2. 过滤使用@PreFilter 和@PostFilter16. acegi 到spring security 的转换方式16.1. Spring Security 是什么16.2. 目标16.3. 步骤16.4. 总结V. 高级话题17. 领域对象安全(ACLs)17.1. 概述17.2. 关键概念17.3. 开始18. 预认证场景18.1. 预认证框架类18.1.1. AbstractPreAuthenticatedProcessingFilter18.1.2. AbstractPreAuthenticatedAuthenticationDetailsSource18.1.2.1. J2eeBasedPreAuthenticatedWebAuthenticationDetailsSource 18.1.3. PreAuthenticatedAuthenticationProvider18.1.4. Http403ForbiddenEntryPoint18.2. 具体实现18.2.1. 请求头认证(Siteminder)18.2.1.1. Siteminder 示例配置18.2.2. J2EE 容器认证19. LDAP 认证19.1. 综述19.2. 在Spring Security 里使用LDAP19.3. 配置LDAP 服务器19.3.1. 使用嵌入测试服务器19.3.2. 使用绑定认证19.3.3. 读取授权19.4. 实现类19.4.1. LdapAuthenticator 实现19.4.1.1. 常用功能19.4.1.2. BindAuthenticator19.4.1.3. PasswordComparisonAuthenticator 19.4.1.4. 活动目录认证19.4.2. 链接到LDAP 服务器19.4.3. LDAP 搜索对象19.4.3.1. FilterBasedLdapUserSearch19.4.4. LdapAuthoritiesPopulator19.4.5. Spring Bean 配置19.4.6. LDAP 属性和自定义UserDetails20. JSP 标签库20.1. 声明Taglib20.2. authorize 标签20.3. authentication 标签20.4. accesscontrollist 标签21. Java 认证和授权服务(JAAS)供应器21.1. 概述21.2. 配置21.2.1. JAAS CallbackHandler21.2.2. JAAS AuthorityGranter22. CAS 认证22.1. 概述22.2. CAS 是如何工作的22.3. 配置CAS 客户端23. X.509 认证23.1. 概述23.2. 把X.509 认证添加到你的web 系统中23.3. 为tomcat 配置SSL24. 替换验证身份24.1. 概述24.2. 配置A. 安全数据库表结构A.1. User 表A.1.1. 组权限A.2. 持久登陆(Remember-Me)表A.3. ACL 表A.3.1. Hypersonic SQLA.3.1.1. PostgreSQLB. 安全命名空间B.1. Web 应用安全- <http> 元素B.1.1. <http> 属性B.1.1.1. servlet-api-provisionB.1.1.2. path-typeB.1.1.3. lowercase-comparisonsB.1.1.4. realmB.1.1.5. entry-point-refB.1.1.6. access-decision-manager-refB.1.1.7. access-denied-pageB.1.1.8. once-per-requestB.1.1.9. create-sessionB.1.2. <access-denied-handler>B.1.3. <intercept-url> 元素B.1.3.1. patternB.1.3.2. methodB.1.3.3. accessB.1.3.4. requires-channelB.1.3.5. filtersB.1.4. <port-mappings> 元素B.1.5. <form-login> 元素B.1.5.1. login-pageB.1.5.2. login-processing-urlB.1.5.3. default-target-urlB.1.5.4. always-use-default-targetB.1.5.5. authentication-failure-urlB.1.5.6. authentication-success-handler-ref B.1.5.7. authentication-failure-handler-ref B.1.6. <http-basic> 元素B.1.7. <remember-me> 元素B.1.7.1. data-source-refB.1.7.2. token-repository-refB.1.7.3. services-refB.1.7.4. token-repository-refB.1.7.5. key 属性B.1.7.6. token-validity-secondsB.1.7.7. user-service-refB.1.8. <session-management> 元素B.1.8.1. session-fixation-protectionB.1.9. <concurrent-control> 元素B.1.9.1. max-sessions 属性B.1.9.2. expired-url 属性B.1.9.3. error-if-maximum-exceeded 属性B.1.9.4. session-registry-alias 和session-registry-ref 属性B.1.10. <anonymous> 元素B.1.11. <x509> 元素B.1.11.1. subject-principal-regex 属性B.1.11.2. user-service-ref 属性B.1.12. <openid-login> 元素B.1.13. <logout> 元素B.1.13.1. logout-url 属性B.1.13.2. logout-success-url 属性B.1.13.3. invalidate-session 属性B.1.14. <custom-filter> 元素B.2. 认证服务B.2.1. <authentication-manager> 元素B.2.1.1. <authentication-provider>元素B.2.1.2. 使用<authentication-provider> 来引用一个AuthenticationProvider Bean B.3. 方法安全B.3.1. <global-method-security> 元素B.3.1.1. secured-annotations 和jsr250-annotations 属性B.3.1.2. 安全方法使用<protect-pointcut>B.3.1.3. <after-invocation-provider> 元素B.3.2. LDAP 命名空间选项B.3.2.1. 使用<ldap-server> 元素定义LDAP 服务器B.3.2.2. <ldap-provider> 元素B.3.2.3. <ldap-user-service> 元素Part I. 入门本指南的后面部分提供对框架结构和实现类的深入讨论,了解它们,对你进行复杂的定制是十分重要的。

相关文档
最新文档