介绍
我使用的CAS
版本是5.2.x
, 提供了REST
方式认证
场景是需要为小程序, 其他APP
提供接口, 所以选用REST
的方式认证身份
认证
CAS REST
认证
推荐先看一遍官方文档, 并实践之后选择使用哪种方式.
Pac4j
认证
Pac4j
提供了非常方便的REST
认证方式 [推荐]
@SneakyThrows
@ResponseBody
@GetMapping({ "v1/login/pwd" })
@ApiOperation(value = "用户名密码REST认证", notes = "用户名密码REST认证")
ResponseResult getJwtByPwd(HttpServletRequest request, HttpServletResponse response){
// 注册service
String serviceUrl = baseSetting.getDomain();
J2EContext context = new J2EContext(request, response);
ProfileManager<CasRestProfile> manager = new ProfileManager<>(context);
Optional<CasRestProfile> profile = manager.get(true);
//获取ticket
TokenCredentials tokenCredentials = casRestFormClient
.requestServiceTicket(serviceUrl, profile.get(), context);
//根据ticket获取用户信息
CasProfile casProfile = casRestFormClient.validateServiceTicket(serviceUrl, tokenCredentials, context);
//生成jwt token
String token = jwtGenerator.generate(casProfile);
return ResponseResult.builder().content(token).build();
}
serviceUrl
为需要认证的服务地址, REST
方式认证的弊端也就是在这, 只能对单个服务认证, 我没有找到对多个服务认证, 有会的同学可以告知一下 >_<
请求方式
https://anybbo.com/v1/login/pwd?client_name=rest&username=admin&password=admin
并且需要为当前路径进行配置, 认证会在securityFilter
中完成, 到达action的时候,, 已经完成了认证, 所以manager.get(true)
会获取到认证信息.
否则获得到的CasRestProfile
为空
definition.addPathDefinition("/v1/login/pwd", "securityFilter");
CasRestFormClient
配置, 此处配置的rest需要与请求中client_name
一致
@Bean
protected CasRestFormClient casRestFormClient() {
CasRestFormClient casRestFormClient = new CasRestFormClient();
casRestFormClient.setConfiguration(casConfiguration());
casRestFormClient.setName("rest");
return casRestFormClient;
}
为Shiro
配置filter
时, 配置好SecurityFilter
, 此时SecurityFilter
会拦截client_name
为cas,rest,basic
的client
.
SecurityFilter filter = new SecurityFilter();
filter.setClients("cas,rest,basic");
filter.setConfig(casConfig());
filter.setMatchers("NOOPTIONS");
最后, 祝大家新年快乐
.
本文由 anybbo 创作,采用 知识共享署名4.0
国际许可协议进行许可
本站文章除注明转载/出处外,均为本站原创或翻译,转载前请务必署名
最后编辑时间为: Dec 17,2020