一、用户认证授权
在系统中最基础的就是用户登陆,一般系统用到的登陆有2种,分别是账号密码和手机验证码。本笔记以账号密码登陆为例,手机验证码登陆等整个框架基本搭好后再写。
1.1 需求分析
用户使用一个系统其实就是访问系统里的每一个功能,在浏览器中对应的就是一个个网页。一个正常的系统,那么肯定存在有些网页不需要权限,所有人都能访问,例如首页,登录页面,找回密码页面等;有些页面则需要用户登陆后才能访问,例如管理页面等。那么这就需要给用户授权,当然根据项目的实际需求,授权也分为功能授权和数据授权,这2块就比较复杂了,以后有机会再说,我这里只做登陆授权的案例。
1.2 单点登录
单点登陆其实就是只要登陆一次可以无缝访问多个相关子项目。具体的含义自行百度。
1.3 第三方认证
第三方认证技术方案最主要是解决认证协议的通用标准 问题,因为要实现 跨系统认证,各系统之间要遵循一定的接口协议。目前应用比较广泛的是Qauth2认证。
二、搭建认证服务
2.1基本需求
本案例认证服务基于Spring Security Oauth2进行构建,并在其基础上作了一些扩展,采用JWT令牌机制,并自定义了用户身份信息的内容。 关于Spring Security 、Oauth2、JWT 可以网上搜索资料,这里就不展开了。 我这里简单说下认证服务的逻辑, 1、用户填写用户名、密码提交到后台,后端按照Spring Security安全框架标准去判断用户名密码是否正确。 2、用户名密码填写正确则根据项目的实际情况做相应的业务处理,例如简单一点的就是获取用户的基本信息,复杂的就需要获取用户的角色权限和数据权限等。这些数据保存到Redis中。 3、在配置文件中设置登陆时效,并且通过定义一种标准来更新登陆时效,类似于最早的用session作为登陆权限判断时自带的过期时间。 4、同一个账号,同时只能登陆一个终端,后登录的会踢掉之前登陆者。
2.2 Redis 整合
2.2.1先在框架pom.xml中引入Redis
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
<exclusions>
<exclusion>
<groupId>io.lettuce</groupId>
<artifactId>lettuce-core</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
</dependency>
2.2.2 配置文件
application.yml 注意:为了简便,下面的配置中我将druid删除了,有需要的查看《笔记三》
spring:
datasource:
name: test
url: jdbc:mysql://localhost:3306/test?useUnicode=true&serverTimezone=GMT&characterEncoding=utf-8&allowMultiQueries=true&useSSL=false
username: root
password: 123456
type: com.alibaba.druid.pool.DruidDataSource
driver-class-name: com.mysql.cj.jdbc.Driver
redis:
database: 1
host: 127.0.0.1
port: 6379
password: 123456
timeout: 5000
jedis:
pool:
max-active: 500
max-wait: 5000
max-idle: 400
min-idle: 50
2.2.3 配置类
@Configuration
public class RedisConfig {
@Bean
public RedisTemplate<String, Object> redisTemplate(final RedisConnectionFactory factory) {
final Jackson2JsonRedisSerializer<Object> j = new Jackson2JsonRedisSerializer<Object>(Object.class);
final RedisTemplate<String, Object> redisTemplate = new RedisTemplate<String, Object>();
redisTemplate.setValueSerializer(j);
redisTemplate.setHashValueSerializer(j);
RedisSerializer<?> stringSerializer = new StringRedisSerializer();
redisTemplate.setKeySerializer(stringSerializer);
redisTemplate.setHashKeySerializer(stringSerializer);
redisTemplate.setConnectionFactory(factory);
redisTemplate.afterPropertiesSet();
return redisTemplate;
}
}
2.2.4 Redis 工具类
可以参考前面的文章,限于篇幅,就不多说了。 《Springboot整合Redis(三) : 整合Redis》 《springboot集成redis高并发下同时保存获取字符串和对象时出现异常的解决办法》
2.2.5 测评Redis
@SpringBootTest(classes = { DemoApplication.class })
class DemoApplicationTests {
@Autowired
HnRedisUtils hnRedisUtils;
@Test
void add() {
hnRedisUtils.set("username", "半路凉亭");
}
}
运行add后,查看redis,如下图说明Redis集成成功 
2.3 Spring Security
2.3.1 引入
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
本案例是通过账号密码方式做登陆认证的,而spring security框架本身就自带密码认证功能,只要按照框架的认证标准创建相应的步骤即可完成认证操作,非常方便。当然,在现实项目中可能除了需要用密码登陆外,还需要用手机验证码登陆,这块要按照spring security框架的结构自定义一些模块即可,后期有机会再写。
2.3.2 项目配置
一个项目的标准化登陆有以下几项设置:不用认证的页面、登陆的失效时间、是否可以多终端登陆等。 application.yml
token:
expire:
seconds: 3600
jwtSecret: H@+N
login:
isMulti: true
passwordParameter: password
loginHTML: /login.html
loginProcessingUrl: /login
permitAllUrl: /, /*.html, /login/**, /druid/**
未完待续…
|