CAS+RESTful+Pac4j+Shiro

/ java / 没有评论 / 454浏览

介绍

我使用的CAS版本是5.2.x, 提供了REST方式认证

场景是需要为小程序, 其他APP提供接口, 所以选用REST的方式认证身份

认证

官方文档

推荐先看一遍官方文档, 并实践之后选择使用哪种方式.

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_namecas,rest,basicclient.

SecurityFilter filter = new SecurityFilter();
filter.setClients("cas,rest,basic");
filter.setConfig(casConfig());
filter.setMatchers("NOOPTIONS");

最后, 祝大家新年快乐.