本文主要是介绍Easy-Shiro之微服务鉴权,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
我在easy-shiro里面加了两个模块,intercept-method和intercept-dubbo,用于api拦截鉴权和dubbo的微服务调用鉴权,easy-shiro的宗旨是易使用,兼容spring框架、dubbo框架和非spring框架。
示例1:常见的springboot鉴权
示例下载: https://download.csdn.net/download/rocklee/85099896
示例2: 微服务之鉴权中心
加入依赖
<!-- easy-shiro --><dependency><groupId>io.github.tiger822</groupId><artifactId>easy-shiro-intercept-dubbo</artifactId><version>1.1-SNAPSHOT</version></dependency>
大部分代码同示例1,加入如下功能:
a. api模块中加入AuthorizationService服务
/*** 认证鉴权api* Created by rocklee on 2022/4/6 9:50*/
public interface AuthorizationService {SentinelResponseEntity login(String user, String password,String ... sessionId);
}
b.鉴权中心服务中加入AuthorizationService实现
login api接受sessionid,如果这个session id有效则重新登录后依然会沿用此session,如果无效或已过期,会重新生成新的session id,而easy-shiro会提供同一帐户同时上线机制,根本配置要求会自动互踢,比如可以配置为同一帐户的计算上线人数以account为准还是以account+设备为准,最大同时上线数量是多少,超过的话就会踢掉最先上线的session。
/*** Created by rocklee on 2022/4/6 9:51*/
@DubboService(cluster = "failover")//默认重试两次
public class AuthorizationServiceImp implements AuthorizationService {@Resourceprivate AuthenConfig authenConfig;@Resourceprivate SessionUtils sessionUtils;@Overridepublic SentinelResponseEntity login(String user, String password,String ... sessionId) {if (user==null){return SentinelResponseEntity.fromResult(0,"显示登录界面");}SessionTokenUtils.updateSecurityManager();SentinelResponseEntity<String> entity=new SentinelResponseEntity<>();Subject subject =null;try {subject= sessionId.length > 0 && !StringUtils.isBlank(sessionId[0]) ?sessionUtils.createSubject(sessionId[0]) : SecurityUtils.getSubject(); // 获取当前主体}catch (ExpiredSessionException| UnknownSessionException e){subject=SecurityUtils.getSubject();}UsernamePasswordToken token = new UsernamePasswordTokenEx(user, password,"business-app");try {subject.login(token); // 登录if (!StringUtils.isBlank(authenConfig.getProperties().getSessionTokenName())){entity.put(authenConfig.getProperties().getSessionTokenName(), subject.getSession().getId().toString());}if (!StringUtils.isBlank(authenConfig.getProperties().getJwtTokenName())){String jwtToken= JwtUtils.getToken(subject.getSession().getId(),authenConfig.getProperties().getSessionTimeOut(), TimeUnit.SECONDS);//返回两组token,之后的访问随便用哪个entity.put(authenConfig.getProperties().getJwtTokenName(), jwtToken);}entity.setResult("OK");return entity;}catch (UnknownAccountException | IncorrectCredentialsException e){return SentinelResponseEntity.fromErr(0,1,"用户或密码无效");}}
}
从代码可见,返回的结构里面会包含token.
调用认证
启动鉴权中心、account-server,然后在order-service里面加入如下测试:
SentinelResponseEntity entity=authorizationService.login("user1","123456");
System.out.println(JsonUtils.toJsonString(entity));
你会发现entity里面有一节token的,就是登录后拿到的session id
调用其他微服务前只要用SessionTokenUtils.setToken(token)更新一下调用方的token,框架就会将这个token一起带到provider那边进行鉴权认证。
而provider提个的api则无需任何改变,只提个标准的shiro鉴权注解即可。
这篇关于Easy-Shiro之微服务鉴权的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!