1. 前言
前一篇介绍了入门的基础准备。从今天开始我们来一步步窥探它是如何工作的。我们又该如何驾驭它。请多多关注公众号:。本篇将通过来讲解中的用户主体。以及从中找点乐子。
2. Spring Boot 集成 Spring Security
这个简直老生常谈了。不过为了照顾大多数还是说一下。集成只需要引入其对应的组件。不仅仅能保护应用,也可以保护应用,本文我们讲前者。我们只需要在项目引入以下依赖即可:
3. UserDetailsServiceAutoConfiguration
启动项目,访问端点会跳转到一个登录页面如下:
要求你输入用户名(默认值为user)和密码。密码在springboot控制台会打印出类似的字样,后面的长串就是密码,当然这不是生产可用的。如果你足够细心会从控制台打印日志发现该随机密码是由配置类生成的,我们就从它开始顺藤摸瓜来一探究竟。
3.1 UserDetailsService
接口。该接口只提供了一个方法:
该方法很容易理解:通过用户名来加载用户。这个方法主要用于从系统数据中查询并加载具体的用户到Spring Security中。
3.2 UserDetails
从上面可以知道最终交给Spring Security的是。该接口是提供用户信息的核心接口。该接口实现仅仅存储用户的信息。后续会将该接口提供的用户信息封装到认证对象中去。默认提供了:
用户的权限集, 默认需要添加前缀
用户的加密后的密码, 不加密会使用前缀
应用内唯一的用户名
账户是否过期
账户是否锁定
凭证是否过期
用户是否可用
如果以上的信息满足不了你使用,你可以自行实现扩展以存储更多的用户信息。比如用户的邮箱、手机号等等。通常我们使用其实现类:
该类内置一个建造器会很方便地帮助我们构建对象,后面我们会用到它。
3.3 UserDetailsServiceAutoConfiguration
全限定名为:
源码如下:
我们来简单解读一下该类,从系列注解我们知道该类在类路径下存在、在Spring 容器中存在Bean并且不存在Bean,,的情况下生效。千万不要纠结这些类干嘛用的!该类只初始化了一个类型的Bean。类型负责对安全用户实体抽象的增删查改操作。同时还继承了接口。
明白了上面这些让我们把目光再回到上来。该类初始化了一个名为的内存用户管理器。该管理器通过配置注入了一个默认的存在内存中,就是我们上面用的那个,每次启动都是动态生成的。那么问题来了如果我们定义自己的 Bean是不是就可以实现我们需要的用户管理逻辑呢?
3.4 自定义UserDetailsManager
我们来自定义一个来看看能不能达到自定义用户管理的效果。首先我们针对的所有方法进行一个代理的实现,我们依然将用户存在内存中,区别就是这是我们自定义的:
该类负责具体对的增删改查操作。我们将其注入Spring 容器:
为了方便测试 我们也内置一个名称为密码为的用户,密码采用明文 当你在密码上使用了前缀意味着你的密码不使用加密,这里我们并没有指定密码加密方式你可以使用来指定一种加密方式。通常推荐使用作为加密方式。默认Spring Security使用的也是此方式。authorities 一定不能为这代表用户的角色权限集合。接下来我们实现一个并注入Spring 容器:
这样实际执行委托给了来做。我们重复的动作进入登陆页面分别输入和成功进入。
3.5 数据库管理用户
经过以上的配置,相信聪明的你已经知道如何使用数据库来管理用户了 。只需要将中的属性替代为抽象的Dao接口就行了,无论你使用还是来实现。
4. 总结
今天我们对Spring Security 中的用户信息相关进行的一些解读。并自定义了用户信息处理服务。相信你已经对在Spring Security中如何加载用户信息,如何扩展用户信息有所掌握了。后面我们会由浅入深慢慢解读Spring Security。相关代码已经上传git仓库,关注公众号后回复获取demo源码。后续也可以及时获取更多相关干货教程。