권한에 따라 접근할 수 있는 유저권한 URL을 만듭니다.
- HelloController.java
package com.sp.fc.web.controller;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class HelloController {
@RequestMapping("/")
public String index() {
return "홈페이지";
}
@RequestMapping("/auth")
public Authentication auth() {
return SecurityContextHolder.getContext()
.getAuthentication();
}
// 유저페이지
@PreAuthorize("hasAnyAuthority('ROLE_USER')") // 권한
@RequestMapping("/user")
public SecurityMessage user() {
return SecurityMessage.builder()
.auth(SecurityContextHolder.getContext().getAuthentication())
.message("User 정보")
.build();
}
// 어드민페이지
@PreAuthorize("hasAnyAuthority('ROLE_ADMIN')") // 권한
@RequestMapping("/admin")
public SecurityMessage admin() {
return SecurityMessage.builder()
.auth(SecurityContextHolder.getContext().getAuthentication())
.message("Admin 정보")
.build();
}
}
권한 메시지를 보여주기 위한 SecurityMessage를 만듭니다.
- SecurityMessage.java
package com.sp.fc.web.controller;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.security.core.Authentication;
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class SecurityMessage {
private Authentication auth;
private String message;
}
application.yml 를 통해 서버포트번호와 시큐리티 계정권한을 셋팅한다.
server:
port: 9050
spring:
security:
user:
name: user1
password: 1111
roles: USER
SecurityConfig를 통해 계정, 권한, 패스워드 인코더, 웹페이지 접근 권한도 설정이 가능합니다.
- SecurityConfig.java
package com.sp.fc.web.config;
import org.springframework.context.annotation.Bean;
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.core.userdetails.User;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;
@EnableWebSecurity(debug = true)
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class SecurityConfig extends WebSecurityConfigurerAdapter {
// inMemoryAuthentication을 설정하게되면 application.yml 있는 정보는 더 이상 적용되지 않습니다.
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.inMemoryAuthentication()
.withUser(User.builder()
.username("user2")
.password(passwordEncoder().encode( "2222"))
.roles("USER"))
.withUser(User.builder()
.username("admin")
.password(passwordEncoder().encode("3333"))
.roles("ADMIN"));
}
// 패스워드 인코더
@Bean
PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}
// 홈페이지는 누구나 접근 가능하게 설정
@Override
protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests((requests) ->
requests.antMatchers("/").permitAll() // 모든사람에게 홈페이지 접근허용
.anyRequest().authenticated()); // 어떠한 리퀘스트도 인증 받은 상태에서 접근해라.
http.formLogin();
http.httpBasic();
}
}
* 홈페이지
* user로 접근한 화면(http://localhost:9050/user)
* admin로 접근한 화면 (http://localhost:9050/admin)
출처 : 패스트 캠퍼스
'SPRING > 개발 TIP' 카테고리의 다른 글
[SPRING] AOP 정리 및 실습 (1) (0) | 2021.04.14 |
---|---|
[SPRING] @Builder와 @NoArgsConstructor 함께 사용하기 (0) | 2021.03.28 |
[SPRING] Spring Security (1) 서버 구축하기 (0) | 2021.03.03 |
[SPRING] JPA Querydsl Repository Support 활용 (0) | 2021.02.27 |
[Spring] Intelli J에서 JUnit 생성하기 (0) | 2021.02.26 |