SSO半成品笔记

简介:

1 参考如下文章整理的笔记

2 CAS实现SSO的原理图

CAS实现SSO的原理图

3 AuthenticationEntryPoint用户登录入口

ExceptionTranslationFilter拥有该对象,在捕获到AuthenticationException和AccessDeniedException异常时,如果是未登录状态则使用AuthenticationEntryPoint引导用户到登陆界面,接口定义如下:

public interface AuthenticationEntryPoint {

    //准备认证过程
    void commence(HttpServletRequest request, HttpServletResponse response, AuthenticationException authException)
        throws IOException, ServletException;
}

实现情况如下:

AuthenticationEntryPoint接口实现

默认实现LoginUrlAuthenticationEntryPoint,就是指定一个重定向地址,改地址不能被拦截,如下配置

<security:http auto-config="true">
  <security:form-login login-page="/login.html"
     login-processing-url="/login.do" username-parameter="username"
     password-parameter="password" />
  <!-- 表示匿名用户可以访问 -->
  <security:intercept-url pattern="/login.html" access="IS_AUTHENTICATED_ANONYMOUSLY"/>
  <security:intercept-url pattern="/**" access="ROLE_USER" />
</security:http>

如果是CAS实现即CasAuthenticationEntryPoint:

也很简单就是重定向到CAS Server所在地址,同时带上目前要访问的serviceUrl。

总体地址就是:casServerLoginUrl?serviceParameterName=URLEncoder.encode(serviceUrl, "UTF-8");

上述serviceParameterName来源是ServiceProperties对象,该对象用户保存和CAS Server交流的属性名称,默认如下:

public class ServiceProperties implements InitializingBean {

    public static final String DEFAULT_CAS_ARTIFACT_PARAMETER = "ticket";

    public static final String DEFAULT_CAS_SERVICE_PARAMETER = "service";
}

CasAuthenticationEntryPoint拥有上述ServiceProperties对象:

public class CasAuthenticationEntryPoint implements AuthenticationEntryPoint, InitializingBean {

    private ServiceProperties serviceProperties;

    //即CAS Server的登陆地址
    private String loginUrl;
}

4 CasAuthenticationProvider对用户的ticket请求进行验证

认证过程如下:

final Assertion assertion = this.ticketValidator.validate(authentication.getCredentials().toString(), getServiceUrl(authentication));
final UserDetails userDetails = loadUserByAssertion(assertion);
userDetailsChecker.check(userDetails);
return new CasAuthenticationToken(this.key, userDetails, authentication.getCredentials(),
                authoritiesMapper.mapAuthorities(userDetails.getAuthorities()), userDetails, assertion);
  • 1 使用内部对象TicketValidator ticketValidator向CAS Server发送验证请求,参数是ticket和serviceUrl。CAS Server会返回xml内容作为响应,处理响应构建一个Assertion对象

  • 2 再对上述Assertion对象进行检查是否被锁等,最后封装成一个CasAuthenticationToken对象,CasAuthenticationProvider认证结束

之后要做的就是把上述认证结果保存到session中。谁来做?应该是之前的Filter SecurityContextPersistenceFilter,它专门负责将认证信息存入session中。

CasAuthenticationFilter 掌控执行认证过程

认证Filter

我们已经知道UsernamePasswordAuthenticationFilter、CasAuthenticationFilter两者都有一个是否需要认证的判断逻辑

前者就是判断是否是要处理的登陆地址,后者判断请求是否含有ticket参数

然后就是利用AuthenticationManager来进行认证了:

final String username = serviceTicketRequest ? CAS_STATEFUL_IDENTIFIER : CAS_STATELESS_IDENTIFIER;
String password = obtainArtifact(request);

if (password == null) {
    logger.debug("Failed to obtain an artifact (cas ticket)");
    password = "";
}

final UsernamePasswordAuthenticationToken authRequest = new UsernamePasswordAuthenticationToken(username, password);

authRequest.setDetails(authenticationDetailsSource.buildDetails(request));

return this.getAuthenticationManager().authenticate(authRequest)

一旦使用上述CasAuthenticationProvider认证成功,则需要将认证结果Authentication保存到SecurityContext中,然后使用SecurityContextPersistenceFilter将SecurityContext保存到session中

相关文章
|
NoSQL 前端开发 数据库
淘东电商项目(36) -SSO单点登录(退出功能)
淘东电商项目(36) -SSO单点登录(退出功能)
65 0
|
移动开发 NoSQL Redis
淘东电商项目(35) -SSO单点登录(登录功能完善)
淘东电商项目(35) -SSO单点登录(登录功能完善)
96 0
|
SQL 前端开发
TienChin 渠道管理-权限分配
TienChin 渠道管理-权限分配
67 0
|
数据可视化 前端开发 Java
servlet+mysql实现的学生评教系统(角色:学生、教师、管理员 功能:评教、修改密码、评教规则管理、评教结果查看、学生管理、教师管理、班级管理、学生信息、评教结果可视化展示等)
servlet+mysql实现的学生评教系统(角色:学生、教师、管理员 功能:评教、修改密码、评教规则管理、评教结果查看、学生管理、教师管理、班级管理、学生信息、评教结果可视化展示等)
servlet+mysql实现的学生评教系统(角色:学生、教师、管理员 功能:评教、修改密码、评教规则管理、评教结果查看、学生管理、教师管理、班级管理、学生信息、评教结果可视化展示等)
|
Java 关系型数据库 MySQL
SSM框架(spring+springmvc+mybatis)+Mysql实现的高校运动会管理系统(角色分为管理员和普通用户 功能包含普通学生老师参赛、开幕广播信息查看、管理员广播器材用户赛事管理等)
SSM框架(spring+springmvc+mybatis)+Mysql实现的高校运动会管理系统(角色分为管理员和普通用户 功能包含普通学生老师参赛、开幕广播信息查看、管理员广播器材用户赛事管理等)
SSM框架(spring+springmvc+mybatis)+Mysql实现的高校运动会管理系统(角色分为管理员和普通用户 功能包含普通学生老师参赛、开幕广播信息查看、管理员广播器材用户赛事管理等)
|
数据安全/隐私保护
MyCms 开源自媒体系统后台 角色管理&管理员管理操作说明
MyCms 开源自媒体系统后台 角色管理&管理员管理操作说明
184 0
好好编程-物流项目13【登录认证-shiro实现】
我们已经完成了用户的CRUD操作。本文我们来介绍下基于Shiro的登录认证操作。
好好编程-物流项目13【登录认证-shiro实现】
|
SQL 存储 前端开发
JSP+Servlet培训班作业管理系统[16]–校长角色之课程浏览功能实现
本文目录 1. 本章任务 2. 为校长添加菜单 3. 跳转课程浏览页时携带课程数据 4. 添加course.jsp页面 5. 存在的问题 6. 联表查询用户姓名 6.1 修改Course类 6.2 修改CourseDao 6.3 修改courseView.jsp 7. 总结
163 0
JSP+Servlet培训班作业管理系统[16]–校长角色之课程浏览功能实现
|
Java 数据库 数据安全/隐私保护
JSP+Servlet培训班作业管理系统[4]–记录登录用户信息
本文目录 1. 本章任务 2. 点击登录后记录用户信息 3. 构造测试用户对象 4. 显示登录用户信息 5. 测试
263 0
JSP+Servlet培训班作业管理系统[4]–记录登录用户信息