๋ก๊ทธ์์
๋ก๊ทธ์์ ๊ด๋ จ ์ค์ ์ ํด๋ด
๋๋ค.
// ๐ ๋ก๊ทธ์์ ์ค์
http.logout(logout -> logout
.logoutUrl("/logout") // ๋ก๊ทธ์์ ์์ฒญ ๊ฒฝ๋ก
.logoutSuccessUrl("/login?logout") // ๋ก๊ทธ์์ ์ฑ๊ณต ์ URL
.invalidateHttpSession(true) // ์ธ์
์ด๊ธฐํ
.deleteCookies("remember-id") // ๋ก๊ทธ์์ ์, ์์ด๋ ์ ์ฅ ์ฟ ํค ์ญ์
// .logoutSuccessHandler(null) // ๋ก๊ทธ์์ ์ฑ๊ณต ์ฒ๋ฆฌ์ ์ค์
);
Java
๋ณต์ฌ
SecurityConfig.java
@Slf4j
@Configuration
@EnableWebSecurity
public class SecurityConfig {
@Autowired
private DataSource dataSource;
@Autowired
private UserDetailServiceImpl userDetailServiceImpl;
@Autowired
private LoginSuccessHandler loginSuccessHandler;
@Autowired
private LoginFailureHandler loginFailureHandler;
@Autowired
private CustomAccessDeniedHandler customAccessDeniedHandler;
// ์คํ๋ง ์ํ๋ฆฌํฐ ์ค์ ๋ฉ์๋
@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
// โ
์ธ๊ฐ ์ค์
http.authorizeHttpRequests(auth -> auth
.requestMatchers("/admin", "/admin/**").hasRole("ADMIN")
.requestMatchers("/user", "/user/**").hasAnyRole("USER","ADMIN")
.requestMatchers("/**").permitAll()
.anyRequest().permitAll()
);
// ๐ ํผ ๋ก๊ทธ์ธ ์ค์
// โ
์ปค์คํ
๋ก๊ทธ์ธ ํ์ด์ง
http.formLogin(login -> login.usernameParameter("id") // ์์ด๋ ํ๋ผ๋ฏธํฐ
.passwordParameter("pw") // ๋น๋ฐ๋ฒํธ ํ๋ผ๋ฏธํฐ
.loginPage("/login") // ๋ก๊ทธ์ธ ํ์ด์ง ๊ฒฝ๋ก
.loginProcessingUrl("/login") // ๋ก๊ทธ์ธ ์์ฒญ ๊ฒฝ๋ก
// .defaultSuccessUrl("/?success") // ๋ก๊ทธ์ธ ์ฑ๊ณต ๊ฒฝ๋ก
.successHandler(loginSuccessHandler) // ๋ก๊ทธ์ธ ์ฑ๊ณต ์ฒ๋ฆฌ์ ์ค์
// .failureUrl("/login?error") // ๋ก๊ทธ์ธ ์คํจ ๊ฒฝ๋ก
.failureHandler(loginFailureHandler) // ๋ก๊ทธ์ธ ์คํจ ์ฒ๋ฆฌ์ ์ค์
)
;
// ๐ฉโ๐ผ ์ฌ์ฉ์ ์ ์ ์ธ์ฆ
http.userDetailsService(userDetailServiceImpl);
// ๐ ์๋ ๋ก๊ทธ์ธ ์ค์
http.rememberMe(me -> me.key("aloha")
.rememberMeParameter("auto-login")
.tokenRepository(tokenRepository())
.tokenValiditySeconds(60 * 60 * 24 * 7)); // 7์ผ ์ ํจ์๊ฐ (์ด๋จ์)
// ์ธ์ฆ ์์ธ ์ฒ๋ฆฌ
http.exceptionHandling( exception -> exception
// ์์ธ ์ฒ๋ฆฌ ํ์ด์ง ์ค์
// .accessDeniedPage("/exception")
// ์ ๊ทผ ๊ฑฐ๋ถ ์ฒ๋ฆฌ์ ์ค์
.accessDeniedHandler(customAccessDeniedHandler)
);
// ๐ ๋ก๊ทธ์์ ์ค์
http.logout(logout -> logout
.logoutUrl("/logout") // ๋ก๊ทธ์์ ์์ฒญ ๊ฒฝ๋ก
.logoutSuccessUrl("/login?logout") // ๋ก๊ทธ์์ ์ฑ๊ณต ์ URL
.invalidateHttpSession(true) // ์ธ์
์ด๊ธฐํ
.deleteCookies("remember-id") // ๋ก๊ทธ์์ ์, ์์ด๋ ์ ์ฅ ์ฟ ํค ์ญ์
// .logoutSuccessHandler(null) // ๋ก๊ทธ์์ ์ฑ๊ณต ์ฒ๋ฆฌ์ ์ค์
);
return http.build();
}
/**
* ๐ ๋น๋ฐ๋ฒํธ ์ํธํ ๋น ๋ฑ๋ก
* @return
*/
@Bean
public PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}
/**
* ๐ AuthenticationManager ์ธ์ฆ ๊ด๋ฆฌ์ ๋น ๋ฑ๋ก
* @param authenticationConfiguration
* @return
* @throws Exception
*/
@Bean
public AuthenticationManager authenticationManager(
AuthenticationConfiguration authenticationConfiguration ) throws Exception {
return authenticationConfiguration.getAuthenticationManager();
}
/**
* ๐ JDBC ์ธ์ฆ ๋ฐฉ์ ๋น ๋ฑ๋ก
* @return
*/
// @Bean
// public UserDetailsService userDetailsService() {
// JdbcUserDetailsManager userDetailsManager
// = new JdbcUserDetailsManager(dataSource);
// // ์ฌ์ฉ์ ์ธ์ฆ ์ฟผ๋ฆฌ
// String sql1 = " SELECT username, password, enabled "
// + " FROM user "
// + " WHERE username = ? "
// ;
// // ์ฌ์ฉ์ ๊ถํ ์ฟผ๋ฆฌ
// String sql2 = " SELECT username, auth "
// + " FROM user_auth "
// + " WHERE username = ? "
// ;
// userDetailsManager.setUsersByUsernameQuery(sql1);
// userDetailsManager.setAuthoritiesByUsernameQuery(sql2);
// return userDetailsManager;
// }
/**
* ๐ ์๋ ๋ก๊ทธ์ธ ์ ์ฅ์ ๋น ๋ฑ๋ก
* โ
๋ฐ์ดํฐ ์์ค
* โญ persistent_logins ํ
์ด๋ธ ์์ฑ
create table persistent_logins (
username varchar(64) not null
, series varchar(64) primary key
, token varchar(64) not null
, last_used timestamp not null
);
* ๐ ์๋ ๋ก๊ทธ์ธ ํ๋ก์ธ์ค
* โ
๋ก๊ทธ์ธ ์
* โก ๐ฉโ๐ผ(ID, ์๋ฆฌ์ฆ, ํ ํฐ) ์ ์ฅ
* โ
๋ก๊ทธ์์ ์,
* โก ๐ฉโ๐ผ(ID, ์๋ฆฌ์ฆ, ํ ํฐ) ์ญ์
* @return
*/
@Bean
public PersistentTokenRepository tokenRepository() {
// JdbcTokenRepositoryImpl : ํ ํฐ ์ ์ฅ ๋ฐ์ดํฐ ๋ฒ ์ด์ค๋ฅผ ๋ฑ๋กํ๋ ๊ฐ์ฒด
JdbcTokenRepositoryImpl repositoryImpl = new JdbcTokenRepositoryImpl();
// โ
ํ ํฐ ์ ์ฅ์๋ฅผ ์ฌ์ฉํ๋ ๋ฐ์ดํฐ ์์ค ์ง์
// - ์ํ๋ฆฌํฐ๊ฐ ์๋ ๋ก๊ทธ์ธ ํ๋ก์ธ์ค๋ฅผ ์ฒ๋ฆฌํ๊ธฐ ์ํ DB๋ฅผ ์ง์ ํฉ๋๋ค.
repositoryImpl.setDataSource(dataSource);
// ์๋ฒ ์คํ ์, ์๋ ๋ก๊ทธ์ธ ํ
์ด๋ธ ์๋ ์์ฑ
// repositoryImpl.setCreateTableOnStartup(true);
// persistent_logins ํ
์ด๋ธ ์์ฑ
try {
repositoryImpl.getJdbcTemplate().execute(JdbcTokenRepositoryImpl.CREATE_TABLE_SQL);
}
catch (BadSqlGrammarException e) {
log.error("persistent_logins ํ
์ด๋ธ์ด ์ด๋ฏธ ์กด์ฌํฉ๋๋ค.");
}
catch (Exception e) {
log.error("์๋ ๋ก๊ทธ์ธ ํ
์ด๋ธ ์์ฑ ์ค , ์์ธ ๋ฐ์");
}
return repositoryImpl;
}
}
Java
๋ณต์ฌ