안녕하세요 저번 시간에 스프링 시큐리티를 사용하여 로그인 기능을 부여하였습니다 이번시간에는 저번 시간에 이어 스프링 시큐리티로 권한을 부여하는 로직을 구현해 보도록 하겠습니다
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 권한을 둘다 부여하였습니다.
로그인 결과 정상적으로 예상 결과값이 나오는 것을 확인 할수 있었습니다 다음번엔 더 재미있는 소재로 찾아뵙도록 하겠습니다 감사합니다.