[Spring Security] 스프링 시큐리티로 권한 부여하기

jihun Choi·2023년 10월 12일
2
post-thumbnail

안녕하세요 저번 시간에 스프링 시큐리티를 사용하여 로그인 기능을 부여하였습니다 이번시간에는 저번 시간에 이어 스프링 시큐리티로 권한을 부여하는 로직을 구현해 보도록 하겠습니다

😎 스프링 시큐리티 권한 부여 로직 구현

AccountService의 loadUserByUsername 메소드에 권한을 넣어주는 로직을 추가하고 권한 목록을 가져와 list로 권한을 반환하는 메소드를 추가로 구현하였습니다

AccountService.java


    @Override
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
        Account account = new Account();
        account.setId(username);
        account = userMapper.findUser(account);
        if(account != null){
            //String인 권한을 List<GrantedAuthority> 형태로 반환
            List<GrantedAuthority> authorities = this.getAuthorites(userMapper.findAuthority(account).getAuth()); 
            account.setAuthorities(authorities);
            LoginUtil.setAccount(account);
            return new User(account.getId(), account.getPasswd(), authorities);
        }
        return null;
    }
    
   public List<GrantedAuthority> getAuthorites(String authorities){
        List<GrantedAuthority> list = new ArrayList<>();

        if(!"".equals(authorities)) {
            for(String str : Arrays.asList(authorities.split(","))){
                list.add(new SimpleGrantedAuthority(str));
            }
        }

        return list;
    }    

권한 체크를 하기위해 LoginUtil 페이지에 유저인지 매니져인지 확인할수 있는 boolean을 반환하는 메소드를 만들어 주었습니다

LoginUtil.java

   public static boolean isManager(){
        Object principal = SecurityContextHolder.getContext().getAuthentication().getPrincipal();
        if(!(principal instanceof String)){
            if(LoginUtil
                    .account
                    .getAuthorities()
                    .stream()
                    .anyMatch(auth -> "ROLE_ADMIN".equals(auth.getAuthority()))){
                return true;
            }
        }
        return false;
    }

    public static boolean isUser(){
        Object principal = SecurityContextHolder.getContext().getAuthentication().getPrincipal();
        if(!(principal instanceof String)){
            if(LoginUtil
                    .account
                    .getAuthorities()
                    .stream()
                    .anyMatch(auth -> "ROLE_USER".equals(auth.getAuthority()))){
                return true;
            }
        }
        return false;
    }

SecurityContextHolder.getContext().getAuthentication().getPrincipal() 펑션으로 로그인 여부를 확인하고 권한을 체크하여 boolean형식으로 반환할수 있도록 만들어 주었습니다.

로그인 후 redirect 되는 페이지에 ROLE_USER와 ROLE_ADMIN 권한을 체크하는 로직을 구현하여 테스트 해보도록 하겠습니다 저는 ROLE_USER와 ROLE_ADMIN 권한을 둘다 부여하였습니다.

로그인 결과 정상적으로 예상 결과값이 나오는 것을 확인 할수 있었습니다 다음번엔 더 재미있는 소재로 찾아뵙도록 하겠습니다 감사합니다.

profile
성장을 위해 열심히 노력하는 개발자 입니다

0개의 댓글