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中

相关文章
|
Java
在高并发环境下,再次认识java 锁
在高并发环境下,再次认识java 锁
131 0
|
11月前
|
人工智能 安全 PyTorch
SPDL:Meta AI 推出的开源高性能AI模型数据加载解决方案,兼容主流 AI 框架 PyTorch
SPDL是Meta AI推出的开源高性能AI模型数据加载解决方案,基于多线程技术和异步事件循环,提供高吞吐量、低资源占用的数据加载功能,支持分布式系统和主流AI框架PyTorch。
439 10
SPDL:Meta AI 推出的开源高性能AI模型数据加载解决方案,兼容主流 AI 框架 PyTorch
|
12月前
|
SQL 数据库
gbase 8a 数据库 SQL优化案例-关联顺序优化
gbase 8a 数据库 SQL优化案例-关联顺序优化
|
XML JSON API
如何接入体育直播接口到移动应用中
要将体育直播接口接入移动应用,需选择可靠的数据服务商(如火星数据),阅读API文档,注册获取API密钥,开发API接口程序,集成到应用中,设计用户界面,测试优化,遵守法律法规,并持续维护更新。这样可以为用户提供实时的体育赛事直播和数据服务。
|
前端开发 JavaScript 算法
JavaScript 中实现常见数据结构:栈、队列与树
JavaScript 中实现常见数据结构:栈、队列与树
284 0
|
Linux Python Windows
Python PDF文件转Word格式,只需要3秒(附打包)
Python PDF文件转Word格式,只需要3秒(附打包)
405 3
Python PDF文件转Word格式,只需要3秒(附打包)
|
C++
C++一分钟之-类型别名与using声明
【7月更文挑战第20天】在C++中,类型别名和`using`声明提升代码清晰度与管理。类型别名简化复杂类型,如`using ComplexType = std::vector&lt;std::shared_ptr&lt;int&gt;&gt;;`,需注意命名清晰与适度使用。`using`声明引入命名空间成员,避免`using namespace std;`全局污染,宜局部与具体引入,如`using math::pi;`。恰当应用增强代码质量,规避常见陷阱。
286 5
|
IDE 安全 PHP
Xdebug+phpStorm安装与调试保姆级教程!『通俗易懂』
Xdebug+phpStorm安装与调试的详细步骤
1052 0
Xdebug+phpStorm安装与调试保姆级教程!『通俗易懂』
|
Kubernetes Cloud Native Nacos
Nacos架构与原理 -服务网格生态
Nacos架构与原理 -服务网格生态
419 0
|
JSON 数据格式
Http响应状态码
只有聪明人才能看见的摘要
269 0