cas集成springboot单点登录

//第一步:写入pom文件jar包坐标

<!-- 单点登录安全框架 -->

<dependency>

  <groupId>org.springframework.security</groupId>

  <artifactId>spring-security-web</artifactId>

</dependency>

<!--cas的客户端 -->

<dependency>

    <groupId>net.unicon.cas</groupId>

    <artifactId>cas-client-autoconfig-support</artifactId>

    <version>2.2.0-GA</version>

    <exclusions>

        <exclusion>

            <groupId>org.jasig.cas.client</groupId>

            <artifactId>cas-client-core</artifactId>

        </exclusion>

    </exclusions>

</dependency>

<dependency> 

  <groupId>org.jasig.cas.client</groupId> 

  <artifactId>cas-client-core</artifactId> 

  <version>3.5.0</version> 

</dependency>

//第二步,获取登录账户用于权限管理

//获取CAS单点登录账户名的两种方法

@RestController

@RequestMapping("/CASUtil")

public class CASUtil {

/**

    * 从cas中获取用户名

    *

    * @param request

    * @return

    */

@LoginCheck(check = false)//不登录也能访问

@RequestMapping("/getUserName2")

  public static String getAccountNameFromCas(HttpServletRequest request) {

      Assertion assertion = (Assertion) request.getSession().getAttribute(AbstractCasFilter.CONST_CAS_ASSERTION);

      if(assertion!= null){

          AttributePrincipal principal = assertion.getPrincipal();

          return principal.getName();

      }else return null;

  }

@LoginCheck(check = false)//不登录也能访问

    @RequestMapping("/getUserName")

  public static String getUserName(HttpServletRequest request) {

  String personCode = "";    //账户名

  AssertionImpl assertion = (AssertionImpl) request.getSession().getAttribute("_const_cas_assertion_");

  if(assertion!=null){

  AttributePrincipal principal = assertion.getPrincipal();

  if(principal!=null){

          personCode = principal.getName();

          return personCode;

  }else{

  return null;

      }

  }else{

      return null;

  } 

  }

}

//第三步springboot 配置文件配置

#cas config

spring.cas.sign-out-filters=/logout

spring.cas.auth-filters=/*

spring.cas.validate-filters=/*

spring.cas.request-wrapper-filters=/*

spring.cas.assertion-filters=/*

spring.cas.redirect-after-validation=true

spring.cas.use-session=true

#the dev of cas config

spring.cas.cas-server-login-url=http://IP/cas/login

spring.cas.cas-server-url-prefix=http://IP/cas

spring.cas.server-name=http://IP:端口

ignore-host-url=http://IP:端口/tsysController/*

//第四步springboot 获取配置文件内容类编写

@ConfigurationProperties(prefix = "spring.cas") 

public class SpringCasAutoconfig { 


    static final String separator = ","; 


    private String validateFilters; 

    private String signOutFilters; 

    private String authFilters; 

    private String assertionFilters; 

    private String requestWrapperFilters; 


    private String casServerUrlPrefix; 

    private String casServerLoginUrl; 

    private String serverName; 

    private boolean useSession = true; 

    private boolean redirectAfterValidation = true; 


    public List<String> getValidateFilters() { 

        return Arrays.asList(validateFilters.split(separator)); 

    } 

    public void setValidateFilters(String validateFilters) { 

        this.validateFilters = validateFilters; 

    } 

    public List<String> getSignOutFilters() { 

        return Arrays.asList(signOutFilters.split(separator)); 

    } 

    public void setSignOutFilters(String signOutFilters) { 

        this.signOutFilters = signOutFilters; 

    } 

    public List<String> getAuthFilters() { 

        return Arrays.asList(authFilters.split(separator)); 

    } 

    public void setAuthFilters(String authFilters) { 

        this.authFilters = authFilters; 

    } 

    public List<String> getAssertionFilters() { 

        return Arrays.asList(assertionFilters.split(separator)); 

    } 

    public void setAssertionFilters(String assertionFilters) { 

        this.assertionFilters = assertionFilters; 

    } 

    public List<String> getRequestWrapperFilters() { 

        return Arrays.asList(requestWrapperFilters.split(separator)); 

    } 

    public void setRequestWrapperFilters(String requestWrapperFilters) { 

        this.requestWrapperFilters = requestWrapperFilters; 

    } 

    public String getCasServerUrlPrefix() { 

        return casServerUrlPrefix; 

    } 

    public void setCasServerUrlPrefix(String casServerUrlPrefix) { 

        this.casServerUrlPrefix = casServerUrlPrefix; 

    } 

    public String getCasServerLoginUrl() { 

        return casServerLoginUrl; 

    } 

    public void setCasServerLoginUrl(String casServerLoginUrl) { 

        this.casServerLoginUrl = casServerLoginUrl; 

    } 

    public String getServerName() { 

        return serverName; 

    } 

    public void setServerName(String serverName) { 

        this.serverName = serverName; 

    } 

    public boolean isRedirectAfterValidation() { 

        return redirectAfterValidation; 

    } 

    public void setRedirectAfterValidation(boolean redirectAfterValidation) { 

        this.redirectAfterValidation = redirectAfterValidation; 

    } 

    public boolean isUseSession() { 

        return useSession; 

    } 

    public void setUseSession(boolean useSession) { 

        this.useSession = useSession; 

    } 

//第五步CAS  java代码过滤器类编写

//CAS登录登录和统一退出 及不登录也能访问路径过滤器配置

@Configuration 

public class CasConfig {

@Value("${ignore-host-url}")

    private String ignoreHostUrl;


    @Autowired 

    SpringCasAutoconfig autoconfig; 


    private static boolean casEnabled  = true; 


    public CasConfig() { 

    } 


    @Bean 

    public SpringCasAutoconfig getSpringCasAutoconfig(){ 

        return new SpringCasAutoconfig(); 

    } 


    /**

    * 用于实现单点登出功能

    */ 

    @Bean 

    public ServletListenerRegistrationBean<SingleSignOutHttpSessionListener> singleSignOutHttpSessionListener() { 

        ServletListenerRegistrationBean<SingleSignOutHttpSessionListener> listener = new ServletListenerRegistrationBean<>(); 

        listener.setEnabled(casEnabled); 

        listener.setListener(new SingleSignOutHttpSessionListener()); 

        listener.setOrder(1); 

        return listener; 

    } 


    /**

    * 该过滤器用于实现单点登出功能,单点退出配置,一定要放在其他filter之前

    */ 

    @Bean 

    public FilterRegistrationBean logOutFilter() { 

        FilterRegistrationBean filterRegistration = new FilterRegistrationBean(); 

        LogoutFilter logoutFilter = new LogoutFilter(autoconfig.getCasServerUrlPrefix() + "/logout?service=" + autoconfig.getServerName(),new SecurityContextLogoutHandler()); 

        filterRegistration.setFilter(logoutFilter); 

        filterRegistration.setEnabled(casEnabled); 

        if(autoconfig.getSignOutFilters().size()>0) 

            filterRegistration.setUrlPatterns(autoconfig.getSignOutFilters()); 

        else 

            filterRegistration.addUrlPatterns("/logout"); 

        filterRegistration.addInitParameter("casServerUrlPrefix", autoconfig.getCasServerUrlPrefix()); 

        filterRegistration.addInitParameter("serverName", autoconfig.getServerName()); 

        filterRegistration.setOrder(2); 

        return filterRegistration; 

    } 


    /**

    * 该过滤器用于实现单点登出功能,单点退出配置,一定要放在其他filter之前

    */ 

    @Bean 

    public FilterRegistrationBean singleSignOutFilter() { 

        FilterRegistrationBean filterRegistration = new FilterRegistrationBean(); 

        filterRegistration.setFilter(new SingleSignOutFilter()); 

        filterRegistration.setEnabled(casEnabled); 

        if(autoconfig.getSignOutFilters().size()>0) 

            filterRegistration.setUrlPatterns(autoconfig.getSignOutFilters()); 

        else 

            filterRegistration.addUrlPatterns("/*"); 

        filterRegistration.addInitParameter("casServerUrlPrefix", autoconfig.getCasServerUrlPrefix()); 

        filterRegistration.addInitParameter("serverName", autoconfig.getServerName()); 

        filterRegistration.setOrder(3); 

        return filterRegistration; 

    } 


    /** 

    * 该过滤器负责用户的认证工作 

    */ 

    @Bean 

    public FilterRegistrationBean authenticationFilter() { 

        FilterRegistrationBean filterRegistration = new FilterRegistrationBean(); 

        filterRegistration.setFilter(new AuthenticationFilter()); 

        filterRegistration.setEnabled(casEnabled); 

        if(autoconfig.getAuthFilters().size()>0) 

            filterRegistration.setUrlPatterns(autoconfig.getAuthFilters()); 

        else 

            filterRegistration.addUrlPatterns("/*"); 

        //casServerLoginUrl:cas服务的登陆url 

        filterRegistration.addInitParameter("casServerLoginUrl", autoconfig.getCasServerLoginUrl()); 

        //本项目登录ip+port 

        filterRegistration.addInitParameter("serverName", autoconfig.getServerName());

        filterRegistration.addInitParameter("ignorePattern", ignoreHostUrl);

        filterRegistration.addInitParameter("useSession", autoconfig.isUseSession()?"true":"false"); 

        filterRegistration.addInitParameter("redirectAfterValidation", autoconfig.isRedirectAfterValidation()?"true":"false"); 

        filterRegistration.setOrder(4); 

        return filterRegistration; 

    } 


    /** 

    * 该过滤器负责对Ticket的校验工作 

    */ 

    @Bean 

    public FilterRegistrationBean cas20ProxyReceivingTicketValidationFilter() { 

        FilterRegistrationBean filterRegistration = new FilterRegistrationBean(); 

        Cas20ProxyReceivingTicketValidationFilter cas20ProxyReceivingTicketValidationFilter = new Cas20ProxyReceivingTicketValidationFilter(); 

        cas20ProxyReceivingTicketValidationFilter.setServerName(autoconfig.getServerName()); 

        filterRegistration.setFilter(cas20ProxyReceivingTicketValidationFilter); 

        filterRegistration.setEnabled(casEnabled); 

        if(autoconfig.getValidateFilters().size()>0) 

            filterRegistration.setUrlPatterns(autoconfig.getValidateFilters()); 

        else 

            filterRegistration.addUrlPatterns("/*"); 

        filterRegistration.addInitParameter("casServerUrlPrefix", autoconfig.getCasServerUrlPrefix()); 

        filterRegistration.addInitParameter("serverName", autoconfig.getServerName()); 

        filterRegistration.setOrder(5); 

        return filterRegistration; 

    } 



    /** 

    * 该过滤器对HttpServletRequest请求包装, 可通过HttpServletRequest的getRemoteUser()方法获得登录用户的登录名 

    * 

    */ 

    @Bean 

    public FilterRegistrationBean httpServletRequestWrapperFilter() { 

        FilterRegistrationBean filterRegistration = new FilterRegistrationBean(); 

        filterRegistration.setFilter(new HttpServletRequestWrapperFilter()); 

        filterRegistration.setEnabled(true); 

        if(autoconfig.getRequestWrapperFilters().size()>0) 

            filterRegistration.setUrlPatterns(autoconfig.getRequestWrapperFilters()); 

        else 

            filterRegistration.addUrlPatterns("/login"); 

        filterRegistration.setOrder(6); 

        return filterRegistration; 

    } 


    /**

    * 该过滤器使得可以通过org.jasig.cas.client.util.AssertionHolder来获取用户的登录名。

    比如AssertionHolder.getAssertion().getPrincipal().getName()。

    这个类把Assertion信息放在ThreadLocal变量中,这样应用程序不在web层也能够获取到当前登录信息

    */ 

    @Bean 

    public FilterRegistrationBean assertionThreadLocalFilter() { 

        FilterRegistrationBean filterRegistration = new FilterRegistrationBean(); 

        filterRegistration.setFilter(new AssertionThreadLocalFilter()); 

        filterRegistration.setEnabled(true); 

        if(autoconfig.getAssertionFilters().size()>0) 

            filterRegistration.setUrlPatterns(autoconfig.getAssertionFilters()); 

        else 

            filterRegistration.addUrlPatterns("/*"); 

        filterRegistration.setOrder(7); 

        return filterRegistration; 

    } 

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,088评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,715评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,361评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,099评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 60,987评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,063评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,486评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,175评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,440评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,518评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,305评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,190评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,550评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,880评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,152评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,451评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,637评论 2 335

推荐阅读更多精彩内容