스프링 시큐리티 인증&권한부여
16 Jul 2018(package org.springframework.security.access.hierarchicalroles;)
public class RoleHierarchyImpl implements RoleHierarchy {}
클래스에서
// SEC-863
private void addReachableRoles(Set<GrantedAuthority> reachableRoles,
GrantedAuthority authority) {
for (GrantedAuthority testAuthority : reachableRoles) {
String testKey = testAuthority.getAuthority();
if ((testKey != null) && (testKey.equals(authority.getAuthority()))) {
return;
}
}
reachableRoles.add(authority);
}
여기에서 admin일 경우 admin의 하위(ROLE_USER, ROLE_ANONYMOUS)를 자동으로 세팅해준다. 유저는 롤유저, 롤어나니머스.
어드민일 경우 자동으로 다른권한을 가져오도록 세팅할 수 있는지는 의문!
권한관련해서는 메뉴별로 관리해주면 해결은 가능
eGov 에서는 유저 정보를 DB에서 관리할 수 있도록 따로 상속받아 구현함.
public class EgovJdbcUserDetailsManager extends JdbcUserDetailsManager {
...
/**
* JdbcDaoImpl 클래스의 loadUsersByUsername 메소드 재정의.
* 사용자명(또는 ID)로 EgovUserDetails의 정보를 조회한다.
*
* @param username
* @return
* @throws UsernameNotFoundException
* @throws DataAccessException
*/
@Override
public EgovUserDetails loadUserByUsername(String username)
throws UsernameNotFoundException, DataAccessException {
List<UserDetails> users = loadUsersByUsername(username);
if (users.size() == 0) {
LOGGER.debug("Query returned no results for user '{}'", username);
throw new UsernameNotFoundException(messages.getMessage("EgovJdbcUserDetailsManager.notFound", new Object[] { username }, "Username {0} not found"));
}
UserDetails obj = users.get(0);
this.userDetails = (EgovUserDetails) obj;
Set<GrantedAuthority> dbAuthsSet = new HashSet<GrantedAuthority>();
dbAuthsSet.addAll(loadUserAuthorities(this.userDetails.getUsername()));
List<GrantedAuthority> dbAuths = new ArrayList<GrantedAuthority>(dbAuthsSet);
addCustomAuthorities(this.userDetails.getUsername(), dbAuths);
if (dbAuths.size() == 0) {
throw new UsernameNotFoundException(messages.getMessage("EgovJdbcUserDetailsManager.noAuthority", new Object[] { username }, "User {0} has no GrantedAuthority"));
}
// RoleHierarchyImpl 에서 저장한 Role Hierarchy 정보가 저장된다.
Collection<? extends GrantedAuthority> authorities = roleHierarchy.getReachableGrantedAuthorities(dbAuths);
// JdbcDaoImpl 클래스의 createUserDetails 메소드 재정의
return new EgovUserDetails(this.userDetails.getUsername(),
this.userDetails.getPassword(), this.userDetails.isEnabled(), true,
true, true, authorities, this.userDetails.getEgovUserVO());
}
(package org.springframework.security.access;)
http://blog.naver.com/PostView.nhn?blogId=tmondev&logNo=220310743818