스프링

 

1. WebSecurityConfigurerAdapter 상속받은 클래스에서

전체 설정

참조 : http://macaronics.net/index.php/m01/spring/view/1812 

  @Override
    protected void configure(HttpSecurity http) throws Exception{
            http.formLogin()
                    .loginPage("/members/login")  //로그인 페이지 URL 을 설정
                    .defaultSuccessUrl("/")    // 로그인 성공시 이동할 URL 을 설정
                    .usernameParameter("email") //로그인시 사용할 파라미터 이름으로 email 을 지정
                    .failureUrl("/members/login/error")  // 로그인 실패시 이동할 URL 을 설정
                    .and()
                    .logout()
                    .logoutRequestMatcher(new AntPathRequestMatcher("/members/logout"))   //로그아웃 URL 을 설정
                    .logoutSuccessUrl("/"); //로그아웃 성공시 이동할 URL 을 설정
 
 
 
            http.authorizeRequests()   //시큐리티 처리에 HttpServletRequest 를 이용한다는 것을 의미.
                    .mvcMatchers("/", "/members/**","/board/**", "/images/**").permitAll()  //permitAll() 을 통해 모든 사용자가 인증(로그인 없이 해당 경로 접근 )
                    .mvcMatchers("/admin/**").hasRole("ADMIN")  // admin 으로 시작하는 경로는 해당 계정이 ADMIN Role 일 경우에만 접근이 가능
                    .anyRequest().authenticated();  //위설정한 경로를 제외한 나머지 경로들은 모든 인증을 요구하도록 설정
 
 
            http.exceptionHandling()
                    .authenticationEntryPoint(new CustomAuthenticationEntryPoint());  //인증되지 않은 사용자가 리소스에 접근하였을 때 수행되는 핸들러를 등록
 
 
    }

 

 

 

 

 

2. 개별 처리 방법

 

 

1) HttpServletRequest 처리 방법

request.isUserInRole("ROLE_ADMIN");

   
    @DeleteMapping("/delete/{id}")
    @ResponseBody
    public ResponseEntity boardDelete(@PathVariable Long id, HttpServletRequest request){
        Boolean roleAdmin=request.isUserInRole("ROLE_ADMIN");
        if(roleAdmin){       
            boardRepository.deleteById(id);
            return new ResponseEntity<Long>(id,HttpStatus.OK);
        }
        return new ResponseEntity<Long>(id,HttpStatus.BAD_REQUEST);
    }

 

<script>
    function deleteBoard(id){
        $.ajax({
            url:'/board/delete/'+id,
            type:"DELETE",
            success:function (res, status){
                console.log("res : " +res);
                console.log("status : " +status);
                if(status=="success"){
                    alert("삭제되었습니다.");
                    location.href='/board/list';
                }
            }
        });
    }
</script>

 

https://offbyone.tistory.com/217

 

 

 

2) spring boot role annotation - 어노테이션 방법

 

참조 : https://www.baeldung.com/spring-security-method-security

다음과 같이 MethodSecurityConfig 클래스를 생성 한다. ( 임의 캐키지에 생성 - WebSecurityConfig ) 

import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity;
import org.springframework.security.config.annotation.method.configuration.GlobalMethodSecurityConfiguration;

@Configuration
@EnableGlobalMethodSecurity(
        prePostEnabled = true,
        securedEnabled = true,
        jsr250Enabled = true)
public class MethodSecurityConfig extends GlobalMethodSecurityConfiguration {
}

 

 

 

    @Secured("ROLE_ADMIN")
    @DeleteMapping("/delete/{id}")
    @ResponseBody
    public ResponseEntity boardDelete(@PathVariable Long id){       
      boardRepository.deleteById(id); 
      return new ResponseEntity<Long>(id,HttpStatus.OK);
    }

 

권한이 안되면 404 에러가 발생한다.

 

 

소스 : https://github.com/braverokmc79/spring-boot-jpa-web-release

 

 

 

 

뷰 Thymeleaf 설정

                <th:block  sec:authorize="hasRole('ROLE_ADMIN')">
                    <button type="button" class="btn btn-primary"  th:onclick="|deleteBoard(*{id})|">삭제</button>
                </th:block>

 

 

 

 

about author

PHRASE

Level 60  라이트

맹물에 조약돌 삶은 맛이다 , 아무 재미도 없이 심심함을 이르는 말.

댓글 ( 4)

댓글 남기기

작성