Spring Security 简单配置用户存储
spring Security从两个角度解决安全问题:
- 使用servlet中的filter来保护web请求,并限制url级别的访问。
- 使用Aop的方法,借助于对象代理和使用通知,来限制用户访问。
Spring Security可以使用java进行简单的配置
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter{}
@EnableWebSecurity注解将会启动Web安全功能,但它本身并没有什么功能。Spring Security必须配置在一个实现了WebSecurityConfigurer的bean中,或者扩展WebSecurityConfigurerAdapter,扩展该类是最简单的配置方法。
我们可以通过重载WebSecurityConfigurerAdapter中的一个或多个方法来指定Web安全的细节。
WebSecurityConfigurerAdapter的三个configure()方法:configure(WebSecurity)、configure(HttpSecurity)、configure(AuthenticationManagerBuilder)
三个实现类分别作用为:configure(AuthenticationManagerBuilder)配置user-detail服务,configure(WebSecurity)配置Spring Security的filter链,configure(HttpSecurity)配置如何通过拦截器保护请求。
每一个用户都应该具有自己信息存储的地方,这样可以方便的进行认证,个性化定制等等。
Spring Security可以实现内存、关系型数据库以及LDAP用户存储的定制。
基于内存的用户存储
继承WebSecurityConfigurerAdapter需要重写的第一个方法就是关于用户细节的。
通过inmMemoryAuthentication()方法,我们可以启用、配置并任意填充基于内存的用户存储。
@Configuration
@EnableWebMvcSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter{
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception{
auth.inMemoryAuthentication().withUser("user").password("password").roles("USER").and().withUser("admin").password("password").roles("USER","ADMIN");
}
}
withUser()方法返回的是UserDetailsManagerConfigurer.UserDetailsBuilder,这个对象提供了多个进一步配置用户的方法,如上面的为用户设置密码的password()方法、授予用户多个角色权限的roles()方法。
常见的方法有,accountLocked(boolean)判断用户是否锁定,authorites()授予某一个用户一项或多项权限。soles()授予某个用户一项或多项权限
基于数据库表的认证
protected void configure(Authentication auth) throws Exception{
auth
.jdbcAuthentication()
.dataSource(dataSource)
.usersByUsernameQuery("select username,password,true from Spitter where username=?")
.authoritiesByUsernameQuery("select username,'ROLE_USER' from Spitter where username=?");
}
我们使用JDBCAuthentication()方法来实现一JDBC为支撑的用户存储,必须要配置的只是一个DataSource,就能访问关系型数据库了
passwordEncoder()方法可以接受Spring Security中PasswordEncoder接口的任意实现。Spring Security的加密模块包括三个这样的实现:BCryptPasswordEncoder、NoOpPasswordEncoder和StandardPasswordEncoder。
基于LDAP认证
protected void configure(Authentication auth) throws Exception{
auth
.ldapAuthentication()
.userSearchFilter("(uid={0})")
.groupSearchFilter("member={0}");
}
配置自定义的用户服务
如果我们需要认证的用户存储在非关系型数据库中,如Mongo或Neo4j,那么我们需要提供一个自定义的UserDetailsService接口实现。UserDetailsService接口非常简单:
public interface UserDetailsService{
UserDetails loadUserByUsername(String username) throws UsernameNotFoundException;
}
我们需要做的就是实现loadUserByUsername()方法,根据给定的用户名来查找用户。该方法会返回代表给定用户的UserDetails对象。
@Autowired
SpitterRepository spitterRepository;
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception{
auth.userDetailsService(new SpitterUserSevice(spitterRepository));
}
- BaiduSubmit:度娘WordPress结构化数据插件(改进版)
- Android自绘动画实现与优化实战——以Tencent OS录音机波形动画为实例
- Go语言归并排序算法实现
- grep无法查找shell传过来的变量?先注意一下文本格式吧!
- 深入浅出 Retrofit,这么牛逼的框架你们还不来看看?
- nwui —— 又一个go语言图形界面解决方案
- Golang 通用连接池
- 解决JS操作Cookies出现的乱码问题,修复WordPress评论乱码
- 分享一个WordPress外链跳转教程,兼容知更鸟暗箱下载和文章索引
- 让WordPress RSS/Feed订阅数据延迟发布,附RSS技巧集锦
- Linux系统防CC攻击自动拉黑IP增强版Shell脚本
- 利用artDialog给网站添加一个能显示搜索来路和关键词的欢迎框
- 解决启用wp super cache缓存后,页面追加多个斜杠仍然可以访问的隐患
- WordPress集成底部滚动推荐条,让好文章不再被埋没
- java教程
- Java快速入门
- Java 开发环境配置
- Java基本语法
- Java 对象和类
- Java 基本数据类型
- Java 变量类型
- Java 修饰符
- Java 运算符
- Java 循环结构
- Java 分支结构
- Java Number类
- Java Character类
- Java String类
- Java StringBuffer和StringBuilder类
- Java 数组
- Java 日期时间
- Java 正则表达式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 异常处理
- Java 继承
- Java 重写(Override)与重载(Overload)
- Java 多态
- Java 抽象类
- Java 封装
- Java 接口
- Java 包(package)
- Java 数据结构
- Java 集合框架
- Java 泛型
- Java 序列化
- Java 网络编程
- Java 发送邮件
- Java 多线程编程
- Java Applet基础
- Java 文档注释
- python 按顺序读文件夹下面的文件
- python剪切文件
- 一个hashCode问题的追问,差点让我陷入无底洞
- 【JAVA基础&高级】 面向对象篇
- MySQL-InnoDb行格式与数据页结构 Krains 2020-08-08
- 《自然语言处理实战入门》 ---- 第4课 :中文分词原理及相关组件简介 之 汉语分词领域主要分词算法、组件、服务(上)...
- MySQL索引 Krains 2020-08-09
- 「查缺补漏」巩固你的Redis知识体系
- MySQL事务 Krains 2020-08-09
- Linux本地提权漏洞复现与检测思路
- 内容安全策略( CSP )
- [译] 优化 React APP 的 10 种方法
- 如何免登陆观看b站大会员番剧
- 聊聊越来越火的对象存储
- AJAX的基本原理及实例解析。