CAS-01 关于CAS服务端设置自定义返回参数给CAS-CLIENT
目录
1.首先要在注册Service的json中配置返回信息的规则
2.为什么会只返回用户名给客户端呢
3.配置注册service的json文件
4.修改表单处理器Handler中添加返回结果
效果演示
CAS服务端默认是只返回登录的用户名,不会返回用户其他的信息,假如我们还需要用户的id,手机号之类的信息怎么办? 可以修改cas服务端,返回更多的信息给客户端。
参考官网
https://apereo.github.io/cas/development/integration/Attribute-Release-Policies.html
1.首先要在注册Service的json中配置返回信息的规则
比如:客户端A需要姓名和身份证号,客户端B需要昵称和头像这些公开信息,具体规则有如下:
● Return All (所有配置返回的都返回)
● Deny All (配置拒绝的出现则报错)
● Return Allowed(只返回允许的主要属性)
● 自定义Filter(自定义过滤策略)
常用为Return All、Return Allowed
2.为什么会只返回用户名给客户端呢
还记得前面自定义handler处理的时候,在验证成功后,返回的结果,具体代码如下:
只是将用户名放进去了,点进去看看底层代码,不出所料,有一个两个参数的重载方法,如下:
只需要将返回的信息,放入一个map中,return回去就可以了。
关于自定义验证,参考前面的博客,之前已经说过了,自定义验证很重要。
具体操作如下
这里演示Return All、Return Allowed 两种情况,
3.配置注册service的json文件
客户端1配置返回所有信息
{"@class" : "org.apereo.cas.services.RegexRegisteredService","serviceId" : "^(https|imaps|http)://app1.cas.com.*","name" : "测试客户端app1","id" : 1000,"description" : "这是app1的客户端","evaluationOrder" : 10,"theme" : "app1","attributeReleasePolicy" : {"@class" : "org.apereo.cas.services.ReturnAllAttributeReleasePolicy"}
}
客户端2配置返回姓名和身份证号
{"@class" : "org.apereo.cas.services.RegexRegisteredService","serviceId" : "^(https|imaps|http)://app2.cas.com.*","name" : "测试客户端app2","id" : 1001,"description" : "这是app2的客户端","evaluationOrder" : 11,"theme" : "app2","attributeReleasePolicy" : {"@class" : "org.apereo.cas.services.ReturnAllowedAttributeReleasePolicy""allowedAttributes" : [ "java.util.ArrayList", [ "name", "id_card_num" ] ]}
}
4.修改表单处理器Handler中添加返回结果
package com.wangsaichao.cas.adaptors.generic;import com.wangsaichao.cas.exception.CaptchaErrorException;
import com.wangsaichao.cas.exception.MyAccountNotFoundException;
import com.wangsaichao.cas.service.UserService;
import org.apache.commons.lang3.StringUtils;
import org.apereo.cas.authentication.AuthenticationHandlerExecutionResult;
import org.apereo.cas.authentication.Credential;
import org.apereo.cas.authentication.PreventedException;
import org.apereo.cas.authentication.handler.support.AbstractPreAndPostProcessingAuthenticationHandler;
import org.apereo.cas.authentication.principal.PrincipalFactory;
import org.apereo.cas.services.ServicesManager;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;import javax.security.auth.login.AccountLockedException;
import javax.security.auth.login.CredentialExpiredException;
import javax.security.auth.login.FailedLoginException;
import java.security.GeneralSecurityException;
import java.util.Map;/*** @author: wangsaichao* @date: 2018/8/31* @description:*/
public class RememberMeUsernamePasswordCaptchaAuthenticationHandler extends AbstractPreAndPostProcessingAuthenticationHandler {private UserService userService;public UserService getUserService() {return userService;}public void setUserService(UserService userService) {this.userService = userService;}public RememberMeUsernamePasswordCaptchaAuthenticationHandler(String name, ServicesManager servicesManager, PrincipalFactory principalFactory, Integer order) {super(name, servicesManager, principalFactory, order);}@Overrideprotected AuthenticationHandlerExecutionResult doAuthentication(Credential credential) throws GeneralSecurityException, PreventedException {RememberMeUsernamePasswordCaptchaCredential myCredential = (RememberMeUsernamePasswordCaptchaCredential) credential;String requestCaptcha = myCredential.getCaptcha();ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();Object attribute = attributes.getRequest().getSession().getAttribute("captcha");String realCaptcha = attribute == null ? null : attribute.toString();if(StringUtils.isBlank(requestCaptcha) || !requestCaptcha.toUpperCase().equals(realCaptcha)){throw new CaptchaErrorException("验证码错误");}String username = myCredential.getUsername();Map<String, Object> user = userService.findByUserName(username);if(user == null){throw new MyAccountNotFoundException("用户不存在");}//可以在这里直接对用户名校验,或者调用 CredentialsMatcher 校验if (!user.get("password").equals(myCredential.getPassword())) {throw new CredentialExpiredException("用户名或密码错误!");}//这里将 密码对比 注销掉,否则 无法锁定 要将密码对比 交给 密码比较器 在这里可以添加自己的密码比较器等//if (!password.equals(user.getPassword())) {// throw new IncorrectCredentialsException("用户名或密码错误!");//}if ("1".equals(user.get("state"))) {throw new AccountLockedException("账号已被锁定,请联系管理员!");}return createHandlerResult(credential, this.principalFactory.createPrincipal(username,user));}@Overridepublic boolean supports(Credential credential) {return credential instanceof RememberMeUsernamePasswordCaptchaCredential;}
}
上面的情况是写在json文件中的,还记得我们前面讲过动态注册service,动态注册service的信息是在代码中生成和json文件相似的信息存入到数据库中,假如是动态注册service的情况该怎么办呢?其实前面的代码中也有写,具体代码如下:
效果演示
CAS-01 关于CAS服务端设置自定义返回参数给CAS-CLIENT相关推荐
- CAS流程简析 服务端校验Ticket
相关阅读 CAS基础组件 简介 CAS流程简析 服务端处理未携带Service登录请求 CAS流程简析 服务端处理携带Service登录请求 CAS基础组件 客户端过滤器 简介 用户访问客户端的请求若 ...
- SSO单点登录系列2:cas客户端和cas服务端交互原理动画图解,cas协议终极分析
落雨 cas 单点登录 一.用户第一次访问web1应用. ps:上图少画了一条线,那一条线,应该再返回来一条,然后再到server端,画少了一步...谢谢提醒.而且,重定向肯定是从浏览器过去的.我写的 ...
- CAS (1) —— Mac下配置CAS到Tomcat(服务端)(转)
tomcat版本: tomcat-8.0.29 jdk版本: jdk1.8.0_65 cas版本: cas4.1.2 cas-client-3.4.1 参考来源: CAS实现单点登录(SSO)经典完整 ...
- 单点登录 cas 二次开发 服务端开发【系列一】
版本说明: cas5.3.mysql5.7.tomcat8.5.jdk8 1.服务端下载 下载5.3版本,下载地址 https://github.com/apereo/cas-overlay-temp ...
- cas 5.3.x 服务端搭建(一)
前期准备: 服务端官⽅下载:https://github.com/apereo/cas-overlay-template 客户端官⽅下载:https://githu b.com/cas-project ...
- 服务端设置忽略更新_react服务端渲染: cookie如何透传给后端,后端如何设置cookie...
原文链接: react服务端渲染: cookie如何透传给后端,后端如何设置cookiewww.douyacun.com react 服务端渲染 cookie 有2个问题: 服务端执行的代码如何拿到 ...
- 服务端设置忽略更新_深入理解Kafka服务端之日志对象的读写数据流程
一.场景分析 在前面几篇分析过,Log类用于管理服务端日志相关的各种操作,如: 日志段管理:滚动生成新日志段.组织并管理分区下的所有日志段等 关键偏移量管理:如LogStartOffset.LEO等 ...
- 传奇私服开服架设教程 传奇服务端设置教程
首先开区要使用两个必备的软件:DBC2000.传奇引擎,当然也少不了传奇服务端(传奇服务端在论坛免费服务端和商业服务端中有下载). 先把下载好的服务端解压到D盘或者某个般的根目录(所谓根目录,就是D盘 ...
- 深入浅出 gRPC 01:gRPC 服务端创建和调用原理
目录 1. RPC 入门 1.1 RPC 框架原理 1.2 业界主流的 RPC 框架 1.3 gRPC 简介 1.3.1 gRPC 概览 1.3.2 gRPC 特点 2. gRPC 服务端创建 2.1 ...
最新文章
- Rust基础笔记:Getting input from the console
- 解析#pragma指令
- 【系统分析与设计】业务流程图绘制方法
- Nginx 笔记与总结(3)配置虚拟主机
- abp mysql .net core_ABP .Net Core Entity Framework迁移使用MySql数据库
- 小米9稳定版系统更新:加入水滴屏形状切换开关
- 大公司都有哪些开源项目~~~简化版
- 关于 if __name__ == '__main__' 的理解
- 16款最佳的 jQuery Time Picker 时间选择插件
- 数据库软件access mysql对比_access数据库软件优缺点对比
- C语言醉酒,驾驶人在道路上饮酒醉酒驾驶机动车处3年以上有期徒刑
- ACM-ICPC 2018 沈阳赛区网络预赛 F. Fantastic Graph (有上下界可行流)
- 广义表的链式定义和基础操作
- 2020美赛赛后感想总结
- 小白学习Spring(二)
- 计算机网络 HTTP请求及响应首部字段
- 计算机辅助制造卜昆内容,西北工业大学07年硕士生入学考试专业课大纲(428计算机辅助制造)...
- error怎么开机 fan_台式机开机出现cpu fan error怎么办
- 和王兴并肩战斗十余年,王慧文的精华思考都在这里了
- 【学习笔记】人工智能哲学研究:《心智、语言和机器》