본문으로 바로가기

[SPRING] Spring Security (2) 기본 권한 설정

category SPRING/개발 TIP 2021. 3. 3. 03:24

권한에 따라 접근할 수 있는 유저권한 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)

 

 

 

출처 : 패스트 캠퍼스