Spring Security基于Java配置
Maven依赖
<dependencies>
<!-- ... other dependency elements ... -->
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-web</artifactId>
<version>4.2.3.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-config</artifactId>
<version>4.2.3.RELEASE</version>
</dependency>
</dependencies>
要点
configureGlobal(AuthenticationManagerBuilder auth)方法:用来配置获取和核对用户信息
configure(HttpSecurity http)方法:用来配置访问资源对应的权限
开启Spring Security:在配置类头上加注解@EnableWebSecurity
@Configuration
@EnableWebSecurity
public class SecurityConfig { @Autowired
public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
auth
.inMemoryAuthentication()
.withUser("user").password("password").roles("USER");
}
}
这个类的配置将产生如下作用:
要求验证所有请求应用的URL
产生一个登录表单界面
只允许使用类中指定的“user”和“password”进行登录才验证通过
运行用户登出(使用post方便访问“/logout”URL)
第8行定义一个在内存中(in memory)的用户,用户名为“user”,密码为“password”,角色为“USER”
初始化:定义一个继承于AbstractSecurityWebApplicationInitializer的类
- 如果不使用Spring 或者Spring MVC,则你需要在这个类中加载上面的配置类,如下
public class SecurityWebApplicationInitializer
extends AbstractSecurityWebApplicationInitializer { public SecurityWebApplicationInitializer() {
super(SecurityConfig.class);
}
}
- 如果使用Spring 或者Spring MVC,只需将这个类置空即可,然后在Spring MVC的启动类中加载SpringSecurity配置类,以下示例的Spring MVC也是基于Java注解配置的,可以看我的另一篇博客Spring完全基于Java和注解配置,如下
public class SecurityWebApplicationInitializer extends AbstractSecurityWebApplicationInitializer {
}
public class MvcWebApplicationInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {
@Override
protected Class<?>[] getRootConfigClasses() {
return new Class[] { WebSecurityConfig.class };
}
// ... other overrides ...
}
第一种方法的SecurityWebApplicationInitializer 将会:
自动注册springSecurityFilterChain Filter拦截所有的URL
添加一个ContextLoaderListener去加载 上面定义SecurityConfig配置类
springSecurityFilterChain Filter:负责应用的所有安全,包括保护URL的访问、验证提交的用户名和密码、重定向到登录表单等
自定义登录界面
修改SecurityConfig类,WebSecurityConfigurerAdapter类提供一些方便的默认设置,使应用程序快速运行。
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter { @Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.antMatchers("/resources/**").permitAll()
.anyRequest().authenticated()
.and()
.formLogin()
.loginPage("/login")
.permitAll()
.and()
.logout()
.permitAll();
} // ...
}
该配置提供:
- 验证每个请求,除了以“/resources/”开头的URL
- 支持基于表单验证,登录页面为“/login”对应的文件
- 支持基于http验证
其中loginPage("/login") 指示:
请求验证时被重定向到 /login
验证失败失败时被重定向到 /login?error
登出成功时会被重定向到 /login?logout
permitAll()方法声明允许在未验证时任何访问到的资源和URL,如果不加则连访问/login 都会一直被重定向
HttpSecurity类:类似XML配置中的<http>元素,可以配置基于web的安全请求,默认下,它会作用于所有的请求,但是可以使用 requestMatcher(RequestMatcher)等类似方法进行限制
以下方法定义只有“USER”角色的用户才能访问“/”URL(即任何请求)
protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests().antMatchers("/**").hasRole("USER").and().formLogin();
}
常用方法:
antMatcher(String antPattern):配置只有当匹配该路径模式时才调用 HttpSecurity
authorizeRequests():限制基于HttpServletRequest之上的使用
csrf():添加CSRF支持configureGlobalSecurity(AuthenticationManagerBuilder auth)用来指定从何处获取用户
configure(HttpSecurity http)用来配置访问每个URL所需的对应权限
UserDetails
UserDetails 是一个 Spring Security 的核心接口,代表一个主体(包含于用户相关的信息)。
在 Authentication 接口中有一个方法 Object getPrincipal(); 这个方法返回的是一个安全主题,大多数情况下,这个对象可以强制转换成 UserDetails 对象,获取到UerDetails 对象之后,就可以通过这个对象的 getUserName()方法获取当前用户名。
自定义验证:通过暴露类型为AuthenticationProvider或者UserDetailsService的bean,使用的验证设置优先级高到低排序为AuthenticationManagerBuilder、AuthenticationProvider、UserDetailsService,即要是发现存在使用前者的配置,则后者的配置无效
通过暴露一个PasswordEncoder类型的bean来定义密码使使用何种编码,如下使用bcrypt
@Bean
public BCryptPasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}
开启方法注解
在任何配置类(使用@Configuration注解的类)头上添加 @EnableGlobalMethodSecurity注解,然后就可以使用@Secured等方法级注解进行安全配置,可以为方法定义一系列属性,这些配置将会通过AccessDecisionManager来实际决定
Spring Security基于Java配置的更多相关文章
- spring-security-4 (2)spring security 基于Java配置的搭建
一.spring security的模块 搭建spring security首先我们要导入必须的jar,即maven的依赖.spring security按模块划分,一个模块对应一个jar. spri ...
- Spring完全基于Java配置和集成Junit单元测试
要点: 配置继承WebApplicationInitializer的类作为启动类,相当于配置web.xml文件 使用@Configuration注解一个类,在类中的方式使用@Bean注解,则表名该方法 ...
- spring boot rest 接口集成 spring security(2) - JWT配置
Spring Boot 集成教程 Spring Boot 介绍 Spring Boot 开发环境搭建(Eclipse) Spring Boot Hello World (restful接口)例子 sp ...
- spring实战六之使用基于java配置的Spring
之前接触的都是基于XML配置的Spring,Spring3.0开始可以几乎不使用XML而使用纯粹的java代码来配置Spring应用.使用基于java配置的Spring的步骤如下: 1. 创建基于ja ...
- Spring入门(8)-基于Java配置而不是XML
Spring入门(8)-基于Java配置而不是XML 本文介绍如何应用Java配置而不是通过XML配置Spring. 0. 目录 声明一个简单Bean 声明一个复杂Bean 1. 声明一个简单Bean ...
- CAS Spring Security 3 整合配置(转)
一般来说, Web 应用的安全性包括用户认证( Authentication )和用户授权( Authorization )两个部分.用户认证指的是验证某个用户是否为系统中的合法主体,也就是说用户能否 ...
- Spring Security(三) —— 核心配置解读
摘要: 原创出处 https://www.cnkirito.moe/spring-security-3/ 「老徐」欢迎转载,保留摘要,谢谢! 3 核心配置解读 上一篇文章<Spring Secu ...
- springmvc基于java配置的实现
该案例的github地址:https://github.com/zhouyanger/demo/tree/master/springmvc-noxml-demo 1.介绍 之前搭建SpringMvc项 ...
- Spring IoC — 基于Java类的配置
普通的POJO只要标注@Configuration注解,就可以为Spring容器提供Bean定义的信息了,每个标注了@Bean的类方法都相当于提供一个Bean的定义信息. 基于Java类的配置方法和基 ...
随机推荐
- VirtualBox网络配置使用案例
VirtualBox VirtualBox is a powerful x86 and AMD64/Intel64 virtualization product for enterprise as ...
- ehcache.xml 属性大全
属性大全 name:缓存名称. maxElementsInMemory:缓存最大个数. eternal:对象是否永久有效,一但设置了,timeout将不起作用. timeToIdleSeconds:设 ...
- iOS 同一个workspace下创建多个项目编程
在iOS开发中,相关联的多个项目可能会放在同一个workspace下进行开发,那习惯了一个项目在一个工作空间下的同学该怎么快速开撸呢? 只需要三步而已! 第一步,先用Xcode在目标目录下创建一个wo ...
- 【SQL.基础构建-第二节(2/4)】
-- Tips:查询基础 --一.SELECT 语句基础-- 1.查询指定列:SELECT 关键字--语法:--SELECT <列名>, ... -- 希望查询列的名称- ...
- [C#]200 行代码使用 C# 实现区块链
文章原文来自:Code your own blockchain in less than 200 lines of Go!,原始文章是通过 Go 语言来实现自己的区块链的,这里我们参照该文章来使用 C ...
- 从零开始搭建支持http2的web服务
前段时间开始,公司各项业务开始陆续接入http2,关于http2的优点与所适用的场景网上有很多的文档可以查阅,这里我主要是总结分享一下如何从0到1搭建http2服务. 这里先说明一下,要完成http2 ...
- ios开发-指纹识别
最近我们使用支付宝怎么软件的时候,发现可以使用指纹了,看起来是否的高大上.当时苹果推出了相关接口,让程序写起来很简单哈. 在iPhone5s的时候,苹果推出了指纹解锁.但是在ios8.0的时候苹果才推 ...
- java修改文件内容
文件的读和写,大家都不陌生,但是修改呢?按照普通的读写流去修改的话,只能全部读取出来,在内存中修改好后,全部写进去,这样对于文件内容过多的时,性能很低. 最近在遇到这个问题的时候,发现RandomAc ...
- 【NOIP2009】Hankson 的趣味题
题目描述 Hanks 博士是 BT (Bio-Tech,生物技术) 领域的知名专家,他的儿子名叫 Hankson.现在,刚刚放学回家的 Hankson 正在思考一个有趣的问题. 今天在课堂上,老师讲解 ...
- [HNOI2008]越狱
题目描述 监狱有连续编号为1...N的N个房间,每个房间关押一个犯人,有M种宗教,每个犯人可能信仰其中一种.如果相邻房间的犯人的宗教相同,就可能发生越狱,求有多少种状态可能发生越狱 输入输出格式 输入 ...