4)Spring Boot+Spring Security集積CAS

11171 ワード

4)Spring Boot+Spring Security集積CAS
予期効果:1.クライアントにアクセスするとcasログイン2.ログイン後、デフォルトのユーザ情報を表示する3.casユーザをユーザマッピングする
ブランチコード:https://github.com/grissomsh/cas/tree/1.x-integration-spring-boot
cas検証プロセス:
  • ユーザは、サービスシステム
  • にアクセスする.
  • 権限がない場合はcasにジャンプし、service=${ url}を携帯するので、ログインページを見たらブラウザパスはhttp://localhost:8080/login?service=http%3A%2F%2Flocalhost%3A8123%2Flogin
  • です.
  • ユーザがcasに登録した後、http://localhost:8123/login/cas?ticket=xxxxx
  • のように、一つのticketを発行します.
  • サービスシステムがチケットを取得した後、このチケットを持って対応するログインユーザ
  • を取得するようにcasに要求する.
  • casは、対応するユーザ情報を返し、サービスシステムが当該ユーザに対してアイデンティティマッピング再認証を行うと、今度のログイン
  • が完了する.
    a.プロジェクト構築
    pom.xml
    
    <dependency>
       <groupId>org.springframework.securitygroupId>
       <artifactId>spring-security-casartifactId>
    dependency>
    b.プロジェクト構成
    Cas SecurityConfig.javacasAuthenticationProvider()方法で作成されたbeanは、ユーザマッピングを設定することができ、正常には、例えば、第三者githubによって登録され、ここで戻ってくるopenidは、githubのユーザIDである場合、ユーザをマッピングしたり、ユーザーをバインディングしたりする必要がある.
    //http://www.baeldung.com/spring-security-cas-sso
    @Configuration
    public class CasSecurityConfig {
        //cas  
        @Value("${cas.server.url:http://localhost:8080}")
        private String casServerUrl;
    
        @Bean
        public ServiceProperties serviceProperties() {
            ServiceProperties serviceProperties = new ServiceProperties();
            //    ,  /login/cas       
            serviceProperties.setService("http://localhost:8123/login/cas");
            serviceProperties.setSendRenew(false);
            return serviceProperties;
        }
    
        @Bean
        @Primary
        public AuthenticationEntryPoint authenticationEntryPoint(
                ServiceProperties sP) {
    
            CasAuthenticationEntryPoint entryPoint
                    = new CasAuthenticationEntryPoint();
            //cas    
            entryPoint.setLoginUrl(casServerUrl + "/login");
            entryPoint.setServiceProperties(sP);
            return entryPoint;
        }
    
        @Bean
        public TicketValidator ticketValidator() {
            //  cas   
            return new Cas30ServiceTicketValidator(
                    casServerUrl);
        }
    
        //cas  
        @Bean
        public CasAuthenticationProvider casAuthenticationProvider() {
    
            CasAuthenticationProvider provider = new CasAuthenticationProvider();
            provider.setServiceProperties(serviceProperties());
            provider.setTicketValidator(ticketValidator());
            //      ,                
            provider.setUserDetailsService(
                    s -> new User("auth-user", "123", true, true, true, true,
                            AuthorityUtils.createAuthorityList("ROLE_ADMIN")));
            provider.setKey("CAS_PROVIDER_LOCALHOST_8123");
            return provider;
        }
    
    
        @Bean
        public SecurityContextLogoutHandler securityContextLogoutHandler() {
            return new SecurityContextLogoutHandler();
        }
    
        @Bean
        public LogoutFilter logoutFilter() {
            //       
            LogoutFilter logoutFilter = new LogoutFilter(
                    casServerUrl + "/logout",
                    securityContextLogoutHandler());
            //cas  
            logoutFilter.setFilterProcessesUrl("/logout/cas");
            return logoutFilter;
        }
    
        @Bean
        public SingleSignOutFilter singleSignOutFilter() {
            //    
            SingleSignOutFilter singleSignOutFilter = new SingleSignOutFilter();
            singleSignOutFilter.setCasServerUrlPrefix(casServerUrl);
            singleSignOutFilter.setIgnoreInitConfiguration(true);
            return singleSignOutFilter;
        }
    
        //      
        @EventListener
        public SingleSignOutHttpSessionListener singleSignOutHttpSessionListener(
                HttpSessionEvent event) {
            return new SingleSignOutHttpSessionListener();
        }
    }
    Web SecurityConfig.java
    なお、1.casAuthenticationFilter()により作成されたbeanはコアであるため、anthenticationManagerを設置しなければならず、casが戻ってきたticketは彼がチェックしてください.2.設定されたServiceProperties bean応答経路は/cas/loginであるため、権限設定でアクセスが許可されていなければなりません.そうでないと、死ループが発生します.
    @Configuration
    @EnableWebSecurity
    @EnableGlobalMethodSecurity(prePostEnabled = true, jsr250Enabled = true)
    public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
    
        @Autowired
        private AuthenticationEntryPoint authenticationEntryPoint;
    
        @Autowired
        private AuthenticationProvider authenticationProvider;
    
        @Autowired
        private SingleSignOutFilter singleSignOutFilter;
    
        @Autowired
        private LogoutFilter logoutFilter;
    
        @Override
        protected void configure(HttpSecurity http) throws Exception {
            //           
            //       filter   ,/login/cas,        ,       
            http
                    .authorizeRequests().antMatchers("/login/cas").permitAll()
                    .and()
                    .authorizeRequests().anyRequest().authenticated()
                    .and()
                    .httpBasic().authenticationEntryPoint(authenticationEntryPoint)
                    .and()
                    .logout().logoutSuccessUrl("/logout")
                    .and()
                    .addFilterBefore(singleSignOutFilter, CasAuthenticationFilter.class).addFilterBefore(logoutFilter, LogoutFilter.class);
        }
    
        @Override
        protected void configure(AuthenticationManagerBuilder auth)
                throws Exception {
            auth.authenticationProvider(authenticationProvider);
        }
    
        @Override
        protected AuthenticationManager authenticationManager() throws Exception {
            //  cas    
            return new ProviderManager(
                    Arrays.asList(authenticationProvider));
        }
    
    
    
        @Bean
        public CasAuthenticationFilter casAuthenticationFilter(ServiceProperties sp)
                throws Exception {
            //cas     ,    filter , ticket    
            CasAuthenticationFilter filter = new CasAuthenticationFilter();
            filter.setServiceProperties(sp);
            filter.setAuthenticationManager(authenticationManager());
            return filter;
        }
    
    
        @Override
        public void configure(WebSecurity web) throws Exception {
            super.configure(web);
        }
    }
    
    b.テスト
  • スタートsso-server
  • sso-interation-spring-bootを起動します.
  • アクセス:http://localhost:8123/profile
    デフォルトアカウントcasuser/Mellonでログインが完了したら、ユーザauth-userの関連データをマッピングすることに応答する.
    sso-serverコードをダウンロードします.