博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
统一认证 - Apereo CAS 客户端的集成以及小结
阅读量:6452 次
发布时间:2019-06-23

本文共 5030 字,大约阅读时间需要 16 分钟。

前两篇介绍了Apereo CAS以及服务器端的安装,但还不够完整,服务端还没有Application真正用起来呢!这篇文章将介绍怎么用起来

集成的目的

客户端我们想要与Apereo CAS做什么集成呢?回顾一下Apereo CAS是做什么的?Apereo CAS的一个功能就是单点登录,统一的登录登出接口与页面,让系统中的模块只需要关注在业务点,而把安全认证的功能交给统一认证来做。所以客户端的集成主要是单点登录的集成,客户端指定需要做安全认证的页面,然后Apereo CAS的安全包检测校验用户登录情况,并自动与CAS登录页面进行跳转交互。

客户端的配置

Apereo CAS提供了Springboot的包,可以让我们的集成些微方便了那么一丢丢!首先我们创建一个Springboot的application,里面带了Apereo CAS start的依赖

org.springframework.security
spring-security-cas

同时在application.properties文件里面指定启动的端口 server.port = 9000

有了Apereo CAS的包之后,我们就可以进行代码的配置。客户端的配置按照SpringSecurity的安全检验流程进行的:

  1. 用户尝试打开一个受保护的url,比如/admin/user
  2. AuthenticationEntryPoint被触发了,把用户重定向到配置好的CAS登录页面:6443/cas
  3. 用户输入用户名密码,登录成功后, CAS会跳转回application指定的回调url :9000/login/cas, 并带上ticket作为查询参数
  4. CasAuthenticationFilter一直在监听/login/cas这个路径,当发现有请求后,它会触发CasTicketValidator,由CasTickerValidator检验ticket的有效性
  5. 当ticket也验证成功后,用户将会被跳转回原来请求的受保护url

下面代码大致描述了这个过程:

@Beanpublic ServiceProperties serviceProperties() {    ServiceProperties serviceProperties = new ServiceProperties();    serviceProperties.setService("http://localhost:9000/login/cas");    serviceProperties.setSendRenew(false);    return serviceProperties;} @Bean@Primarypublic AuthenticationEntryPoint authenticationEntryPoint(  ServiceProperties sP) {      CasAuthenticationEntryPoint entryPoint      = new CasAuthenticationEntryPoint();    entryPoint.setLoginUrl("https://localhost:6443/cas/login");    entryPoint.setServiceProperties(sP);    return entryPoint;} @Beanpublic TicketValidator ticketValidator() {    return new Cas30ServiceTicketValidator(      "https://localhost:6443/cas");} @Beanpublic CasAuthenticationProvider casAuthenticationProvider() {      CasAuthenticationProvider provider = new CasAuthenticationProvider();    provider.setServiceProperties(serviceProperties());    provider.setTicketValidator(ticketValidator());    provider.setUserDetailsService(      s -> new User("casuser", "Mellon", true, true, true, true,        AuthorityUtils.createAuthorityList("ROLE_ADMIN")));    provider.setKey("CAS_PROVIDER_LOCALHOST_9000");    return provider;}
@EnableWebSecurity@Configurationpublic class SecurityConfig extends WebSecurityConfigurerAdapter {     private AuthenticationProvider authenticationProvider;    private AuthenticationEntryPoint authenticationEntryPoint;    private SingleSignOutFilter singleSignOutFilter;    private LogoutFilter logoutFilter;     @Autowired    public SecurityConfig(CasAuthenticationProvider casAuthenticationProvider, AuthenticationEntryPoint eP,                          LogoutFilter lF                          , SingleSignOutFilter ssF    ) {        this.authenticationProvider = casAuthenticationProvider;        this.authenticationEntryPoint = eP;         this.logoutFilter = lF;        this.singleSignOutFilter = ssF;     }         // ...     @Override    protected void configure(AuthenticationManagerBuilder auth) throws Exception {      auth.authenticationProvider(authenticationProvider);    }     @Override    protected AuthenticationManager authenticationManager() throws Exception {      return new ProviderManager(Arrays.asList(authenticationProvider));    }     @Bean    public CasAuthenticationFilter casAuthenticationFilter(ServiceProperties sP) throws Exception {      CasAuthenticationFilter filter = new CasAuthenticationFilter();      filter.setServiceProperties(sP);      filter.setAuthenticationManager(authenticationManager());      return filter;    }}

下面这个文件配置了application中所有/secured/*,login的URL都是受保护资源,都要经过CAS认证过才可以访问:

@EnableWebSecurity@Configurationpublic class SecurityConfig extends WebSecurityConfigurerAdapter {     @Override    protected void configure(HttpSecurity http) throws Exception {      http        .authorizeRequests()        .regexMatchers("/secured.*", "/login")        .authenticated()        .and()        .authorizeRequests()        .regexMatchers("/")        .permitAll()        .and()        .httpBasic()        .authenticationEntryPoint(authenticationEntryPoint);    }    // ...}

服务端Apereo CAS的配置

跟所有统一认证平台一样,所有application想要跟CAS做集成的,都需要在CAS配置相应的参数才可以使用。Apereo CAS提供了很多配置的方式,有YML,JSON, MongoDB以及其他(可查官网)。但高度自由的CAS一如既往的,没有提供可视化操作的界面。比如我们采用JSON的方式。首先我们需要通知Apereo CAS我们采用的是JSON的方式,并通知JSON文件的路径在哪里

cas.serviceRegistry.initFromJson=truecas.serviceRegistry.config.location=classpath:/services

然后我们在这个目录里面,创建一个对应的JSON文件,保存我们的客户端信息,为了方面管理,建议文件名为 application_id.json, 比如"secureApp_9991.json", 内容如下:

{    "@class" : "org.apereo.cas.services.RegexRegisteredService",    "serviceId" : "^http://localhost:9000/login/cas",    "name" : "CAS Spring Secured App",    "description": "This is a Spring App that usses the CAS Server for it's authentication",    "id" : 19991,    "evaluationOrder" : 1}

第一次配置从JSON加载客户端配置的话,需要重启Apereo CAS。之后再加新的客户端的话就不用再重启,Apereo CAS会自动监测这个文件夹的变动

小结

至此我们对于Apereo CAS就有了一个稍微完整一点点的了解,从服务端安装部署,到配置,以及客户端如何集成等。但从这个短时间的学习来看,如果企业已经重度使用了Apereo CAS,那相信它可以很好地服务支撑企业的应用。但如果是新的项目,特别是项目周期比较紧张的项目,并且团队之前没有对统一认证有技术积累的话,不是很建议采用Apereo CAS,这些细微的配置以及无所不在的隐藏功能,会让你给项目经理催死的! 后面我会介绍另外一个统一认证的框架,个人感觉能弥补Apereo CAS的短板的

转载地址:http://oogwo.baihongyu.com/

你可能感兴趣的文章
iOS开发代理(委托)模式详解
查看>>
微服务学习笔记二:Eureka服务注册发现
查看>>
C# 获取编码
查看>>
mysql的数据类型int、bigint、smallint 和 tinyint取值范围
查看>>
利用网易获取所有股票数据
查看>>
HDOJ5015 233 Matrix(矩阵乘法加速递推)
查看>>
三种局域网扫描工具比较
查看>>
移动铁通宽带上网设置教程
查看>>
java中判断字符串中是否有中文字符
查看>>
Python算法(含源代码下载)
查看>>
利用Windows自带的Certutil查看文件MD5
查看>>
Git处理 行结束符
查看>>
通过原生js添加div和css
查看>>
[训练日志] 7月13日
查看>>
Python 模块 和 包
查看>>
简单的导出表格和将表格下载到桌面上。
查看>>
《ArcGIS Engine+C#实例开发教程》第一讲桌面GIS应用程序框架的建立
查看>>
递归查询上一级
查看>>
JAVA - 大数类详解
查看>>
查询指定名称的文件
查看>>