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
OAuth2实现单点登录SSO完整教程,其实不难!(上)
OAuth2实现单点登录SSO完整教程,其实不难!
2728 1
OAuth2实现单点登录SSO完整教程,其实不难!(上)
|
21天前
|
前端开发 NoSQL 应用服务中间件
javaweb单点登录的三种实现方式
javaweb单点登录的三种实现方式
31 0
|
5月前
|
移动开发 NoSQL Redis
淘东电商项目(35) -SSO单点登录(登录功能完善)
淘东电商项目(35) -SSO单点登录(登录功能完善)
44 0
|
5月前
|
NoSQL 前端开发 数据库
淘东电商项目(36) -SSO单点登录(退出功能)
淘东电商项目(36) -SSO单点登录(退出功能)
30 0
|
5月前
|
前端开发
淘东电商项目(33) -SSO单点登录(改造SSO认证服务登录界面)
淘东电商项目(33) -SSO单点登录(改造SSO认证服务登录界面)
37 0
|
5月前
|
安全 数据安全/隐私保护
单点登录(SSO)看这一篇就够了
单点登录(SSO)看这一篇就够了
197 0
|
8月前
|
移动开发 安全 前端开发
(流程图 + 代码)带你实现单点登陆SSO(三)
(流程图 + 代码)带你实现单点登陆SSO
(流程图 + 代码)带你实现单点登陆SSO(二)
(流程图 + 代码)带你实现单点登陆SSO
(流程图 + 代码)带你实现单点登陆SSO(二)
|
8月前
|
存储 安全 Java
(流程图 + 代码)带你实现单点登陆SSO(一)
(流程图 + 代码)带你实现单点登陆SSO
|
存储 缓存 NoSQL
通过阅读源码解决项目难题:GToken替换JWT实现SSO单点登录
今天和大家分享一下使用GoFrame的gtoken替换jwt实现sso登录的经验,为了让大家更好的理解会带大家读一下重点的源码。
122 0
通过阅读源码解决项目难题:GToken替换JWT实现SSO单点登录