Python 官方文档:入门教程 => 点击学习
目录一、整体架构二、实现步骤三、其它问题四、完整代码Java下常用的安全框架主要有spring Security和shiro,都可提供非常强大的功能,但学习成本较高。在微服务下鉴权多
Java下常用的安全框架主要有spring Security和shiro,都可提供非常强大的功能,但学习成本较高。在微服务下鉴权多多少少都会对服务有一定的入侵性。 为了降低依赖,减少入侵,让鉴权功能相对应用服务透明,我们采用网关拦截资源请求的方式进行鉴权。
用户鉴权模块位于api GateWay服务中,所有的API资源请求都需要从此通过。
1. 用户登陆
public LoginUser login(String userName, String passWord){
// 检查密码
User user = userService.checkUser(userName, password);
LoginUser loginUser = LoginUser.builder()
.userName(userName)
.realName(user.getRealName())
.userToken(UUID.randomUUID().toString())
.loginTime(new Date())
.build();
// 保存session
session.saveSession(loginUser);
// 查询权限
List<Permission> permissions = permissionRepository.findByUserName(userName);
// 保存用户权限到缓存中
session.saveUserPermissions(userName, permissions);
return loginUser;
}
// ...
// 缓存用户权限到Redis
public void saveUserPermissions(String userName, List<Permission> permissions) {
String key = String.fORMat("login:permission:%s", userName);
HashOperations<String, String, Object> hashOperations = redisTemplate.opsForHash();
hashOperations.putAll(key, permissions.stream().collect(
Collectors.toMap(p -> p.getMethod().concat(":").concat(p.getUri()),
Permission::getName, (k1, k2) -> k2)));
if (expireTime != null) {
redisTemplate.expire(key, expireTime, TimeUnit.SECONDS);
}
}
userToken
,保存当前登陆信息,缓存用户授权列表2. 拦截请求
@Slf4j
@Component
public class AuthorizationFilter extends AbstractGatewayFilterFactory {
@Autowired
private Session session;
@Override
public GatewayFilter apply(Object config) {
return (exchange, chain) -> {
ServerHttpRequest request = exchange.getRequest();
ServerHttpResponse response = exchange.getResponse();
String uri = request.getURI().getPath();
String method = request.getMethodValue();
// 1.从AuthenticationFilter中获取userName
String key = "X-User-Name";
if (!request.getHeaders().containsKey(key)) {
response.setStatusCode(httpstatus.FORBIDDEN);
return response.setComplete();
}
String userName = Objects.requireNonNull(request.getHeaders().get(key)).get(0);
// 2.验证权限
if (!session.checkPermissions(userName, uri, method)) {
log.info("用户:{}, 没有权限", userName);
response.setStatusCode(HttpStatus.FORBIDDEN);
return response.setComplete();
}
return chain.filter(exchange);
};
}
}
public boolean checkPermissions(String userName, String uri, String method) {
String key = String.format("login:permission:%s", userName);
String hashKey = String.format("%s:%s", method, uri);
if (redisTemplate.opsForHash().hasKey(key, hashKey)){
return true;
}
String allKey = "login:permission:all";
// 权限列表中没有则通过
return !redisTemplate.opsForHash().hasKey(allKey, hashKey);
}
login:permission:all
所有配置过的权限列表需要在程序启动时放入缓存,并需要保持数据的更新3. 鉴权Filter配置
spring:
cloud:
gateway:
routes:
- id: cloud-user
uri: lb://cloud-user # 后端服务名
predicates:
- Path=/user/** # 路由地址
filters:
- name: AuthenticationFilter # 身份认证
- name: AuthorizationFilter # 用户鉴权
- StripPrefix=1 # 去掉前缀
default-filters
默认Filter配置在做单元测试时,如遇到如下错误
nested exception is java.lang.NoClassDefFoundError: javax/validation/ValidationException
请升级依赖包版本:
<!--升级validation-api的版本-->
<dependency>
<groupId>org.hibernate.validator</groupId>
<artifactId>hibernate-validator</artifactId>
<version>6.0.5.Final</version>
</dependency>
<dependency>
<groupId>javax.validation</groupId>
<artifactId>validation-api</artifactId>
<version>2.0.1.Final</version>
</dependency>
代码
以上就是spring cloud下实现用户鉴权的方案的详细内容,更多关于Spring Cloud 用户鉴权的资料请关注编程网其它相关文章!
--结束END--
本文标题: SpringCloud下实现用户鉴权的方案
本文链接: https://www.lsjlt.com/news/158329.html(转载时请注明来源链接)
有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341
下载Word文档到电脑,方便收藏和打印~
2024-03-01
2024-03-01
2024-03-01
2024-02-29
2024-02-29
2024-02-29
2024-02-29
2024-02-29
2024-02-29
2024-02-29
回答
回答
回答
回答
回答
回答
回答
回答
回答
回答
0