用户认证登录流程
设计表格
教师和学生
如果添加权限角色是可以的,从教师表格查询登录用户设置为教师角色,从学生表格查询的用户设置为学生角色
t_student(role=student)
t_teacher(role=teacher)
t_roles角色表格
扥
登录流程
最终效果:如果访问后台(增删改查的功能),不能是学生角色,需要时教师角色,如果是学生账号登录,不允许操作后台班级,专业,学生,教师的任何操作,学生账号只能通过首页教学中心查看自己的学科课程
如果实现这个效果,认证中,第一次访问生成用户信息保存,后续访问,通过过滤器判断当前用户身份,如果是学生,只允许访问教学中心查询课程,如果是教师,都允许。
- 用户提供登录表单访问认证中心,传递用户名和密码
- 认证中心到数据库查询student ,teacher保存数据到redis拿到key值返回给客户端浏览器cookie。
- 客户端登录成功之后,继续访问目标功能,到了zuul网关
- 网关从请求中获取cookie,使用key值到redis检查是否存在认证对象,从而返回应有的结果
- 拒绝访问,没有权限角色
- 允许访问,通过路由找到后端的微服务
实现认证登录
准备一个可用的redis
单节点,哨兵,redis-cluster
创建一个认证中心系统
- maven
- pom继承
<!--持久层相关-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
</dependency>
<!--redis相关-->
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-redis</artifactId>
</dependency>
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
</dependency>
- 属性配置application.properties
server.port=8000
#数据源
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.password=root
spring.datasource.username=root
spring.datasource.url=jdbc:mysql://localhost:3306/aise?useSSL=false
#mybatis
mybatis.mapper-locations=classpath:/mappers/*.xml
mybatis.configuration.map-underscore-to-camel-case=true
#redis相关 单节点2个属性
spring.redis.host=192.168.184.160
spring.redis.port=9000
- 启动类
@SpringBootApplication
@MapperScan("cn.tedu.auth.mapper")
项目中缺少的内容
- redisTemplate自定义配置(重新定义序列化key和value类型),key是String序列化,value是java的序列化
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.RedisSerializer;
/**
* 重新自定义RedisTemplate对象。重新定义序列化
*/
@Configuration
public class RedisConfig {
@Bean("redisTemplate")
public RedisTemplate initRedisTemplate(RedisConnectionFactory factory){
//重新定义RedisTemplate
RedisTemplate<String,Object> redisTemplate=new RedisTemplate<String,Object>();
//重新定义序列化
redisTemplate.setKeySerializer(RedisSerializer.string());//key值的序列化类型,默认java的object,定义成string
redisTemplate.setValueSerializer(RedisSerializer.java());
//设置链接工厂
redisTemplate.setConnectionFactory(factory);
return redisTemplate;
}
}
- authentication认证用户记录队列
String account(学生或者教师账号)
String role(学生或者教师角色)
Long id(学生或者教师id值)
/**
* 这个类,在认证登录结束后,要保存登录者信息
* 所以要存储到redis,并且在网关中要读取
* 进行序列化操作,实现序列化接口
*/
public class Authentication implements Serializable {
public static final String STUDENT="student";
public static final String TEACHER="teacher";
private String account;
private Long id;
private String role;
public String getAccount() {
return account;
}
public void setAccount(String account) {
this.account = account;
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String