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にジャンプし、 です.ユーザがcasに登録した後、 のように、一つのticketを発行します.サービスシステムがチケットを取得した後、このチケットを持って対応するログインユーザ を取得するようにcasに要求する. casは、対応するユーザ情報を返し、サービスシステムが当該ユーザに対してアイデンティティマッピング再認証を行うと、今度のログイン が完了する.
a.プロジェクト構築
pom.xml
Cas SecurityConfig.java
なお、1.スタートsso-server sso-interation-spring-bootを起動します. アクセス:http://localhost:8123/profile
デフォルトアカウント
sso-serverコードをダウンロードします.
予期効果:1.クライアントにアクセスするとcasログイン2.ログイン後、デフォルトのユーザ情報を表示する3.casユーザをユーザマッピングする
ブランチコード:https://github.com/grissomsh/cas/tree/1.x-integration-spring-boot
cas検証プロセス:
service=${ url}
を携帯するので、ログインページを見たらブラウザパスはhttp://localhost:8080/login?service=http%3A%2F%2Flocalhost%3A8123%2Flogin
http://localhost:8123/login/cas?ticket=xxxxx
a.プロジェクト構築
pom.xml
<dependency>
<groupId>org.springframework.securitygroupId>
<artifactId>spring-security-casartifactId>
dependency>
b.プロジェクト構成Cas SecurityConfig.java
casAuthenticationProvider()
方法で作成された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.テストデフォルトアカウント
casuser/Mellon
でログインが完了したら、ユーザauth-user
の関連データをマッピングすることに応答する.sso-serverコードをダウンロードします.