美文网首页spring系列apereo cas
apereo cas客户端登出url重定向

apereo cas客户端登出url重定向

作者: 说你还是说我 | 来源:发表于2018-04-27 00:07 被阅读35次

前面几篇文章都是在讲apereo cas服务端的认证,今天笔者就来说说cas客户端的一些内容。首先是集成cas客户端(spring boot + spring securty + cas client)这是笔者用框架。
在spring boot 文档中没有详细介绍spring security的cas认证协议的认证,而是集成oauth2的认证授权。所以只能去参考spring security文档cas认证章节,然后通过编程的方式来替换配置文件的认证的方式。
总的来说,也就是在spring boot中用编程的方式来代替xml。

参考文章:
https://blog.csdn.net/cl_andywin/article/details/53998986
https://docs.spring.io/spring-security/site/docs/4.2.5.RELEASE/reference/htmlsingle/#cas
https://apereo.github.io/cas/5.2.x/installation/Logout-Single-Signout.html
https://apereo.github.io/cas/5.2.x/protocol/CAS-Protocol-Specification.html

实现步骤

cas 客户端
  • 1 配置ServiceProperties
    @Bean
    public ServiceProperties serviceProperties(){
        ServiceProperties serviceProperties = new ServiceProperties();
        serviceProperties.setSendRenew(false);
        serviceProperties.setService("http://localhost:8090/login");   //当前客户端登录地址
        serviceProperties.setAuthenticateAllArtifacts(true);
        return serviceProperties;
    }
  • 2 配置CasAuthenticationFilter
    @Bean
    public CasAuthenticationFilter casAuthenticationFilter() throws Exception {
        CasAuthenticationFilter filter = new CasAuthenticationFilter();
        filter.setAuthenticationManager(authenticationManager());
        filter.setFilterProcessesUrl("/login");  //处理cas客户端的登录地址
        return filter;
    }
  • 3 配置CasAuthenticationEntryPoint
   @Bean
    public CasAuthenticationEntryPoint casAuthenticationEntryPoint(){
        CasAuthenticationEntryPoint point = new CasAuthenticationEntryPoint();
        point.setLoginUrl("http://localhost:8080/login");  //cas服务端登录地址
        point.setServiceProperties(serviceProperties());  //设置cas客户端信息
        return point;
    }

*4 创建一个认证成功,授权类
这个类需要实现特定的service,因为在provider中需要设置这个授权类。

public class UserServiceImpl implements AuthenticationUserDetailsService<CasAssertionAuthenticationToken> {

    @Override
    public UserDetails loadUserDetails(CasAssertionAuthenticationToken casAssertionAuthenticationToken) throws UsernameNotFoundException {
        System.out.println(casAssertionAuthenticationToken.toString());
        //登录成功,设置用户权限
        UserDetails user =
                User.withDefaultPasswordEncoder()
                        .username(casAssertionAuthenticationToken.getName())
                        .password("password")
                        .roles("USER")
                        .build();
        return user;
    }
}
  • 5 配置CasAuthenticationProvider
    @Bean
    public CasAuthenticationProvider casAuthenticationProvider(){
        //cas票据认证地址设置
        Cas30ServiceTicketValidator validator = new Cas30ServiceTicketValidator("http://localhost:8080");
        CasAuthenticationProvider provider = new CasAuthenticationProvider();
        //cas客户端用户授权方法
        provider.setAuthenticationUserDetailsService(new UserServiceImpl());
        provider.setServiceProperties(serviceProperties());
        provider.setTicketValidator(validator);
        provider.setKey("cas_an_id_for_this_auth_provider_only");
        return provider;
    }
  • 6 配置单点登出SingleSignOutFilter
    @Bean
    public SingleSignOutFilter singleSignOutFilter(){
        SingleSignOutFilter singleSignOutFilter = new SingleSignOutFilter();
        singleSignOutFilter.setCasServerUrlPrefix("http://localhost:8090");
        singleSignOutFilter.setIgnoreInitConfiguration(true);
        return singleSignOutFilter;
    }
  • 7 配置登出LogoutFilter
    @Bean
    public LogoutFilter logoutFilter() throws UnsupportedEncodingException {
        String s = URLEncoder.encode("http://localhost:8090/","utf8");
        //添加service,使cas能够重定向
        String logoutUrl = "http://localhost:8080/logout?service="+s;
        LogoutFilter logoutFilter = new LogoutFilter(logoutUrl,new SecurityContextLogoutHandler());
        //拦截退出的url
        logoutFilter.setFilterProcessesUrl("/logout");
        return logoutFilter;
    }
  • 8 配置spring security拦截
    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        super.configure(auth);
        //添加cas认证
        auth.authenticationProvider(casAuthenticationProvider());
    }

    @Override
    protected void configure(HttpSecurity http) throws Exception {

        http.exceptionHandling().authenticationEntryPoint(casAuthenticationEntryPoint())  //添加cas认证切面
                .and()
                .addFilter(casAuthenticationFilter())   //添加cas认证filter
                .addFilterBefore(logoutFilter(), LogoutFilter.class)    //添加cas登出filter
                .addFilterBefore(singleSignOutFilter(), CasAuthenticationFilter.class)   //添加cas单点登录filter
            .authorizeRequests()
                .antMatchers("/", "/home").permitAll()
                .anyRequest().authenticated()
                .and()
            .formLogin()
                .loginPage("/login")
                .permitAll()
                .and()
            .logout()
                .permitAll();
    }
cas服务端
  • 1 打开登出重定向
    在application.properties添加下面的配置
cas.logout.followServiceRedirects=true

注意:需要根据你自己的服务注册类型来引用不同的maven依赖,在配置相关的service

源码:码云

相关文章

网友评论

本文标题:apereo cas客户端登出url重定向

本文链接:https://www.haomeiwen.com/subject/tisvlftx.html