
๋ก๊ทธ์ธ :
- ํ์์ ๋ณด๋ ๋ณธ์ธ๊ณผ ๊ด๋ฆฌ์๋ง ๋ณผ ์ ์๊ฒ ์ ๊ทผํฉ๋๋ค.
1. ๊ถํ(authority) ํ ์ด๋ธ ๋ง๋ค๊ธฐ
CREATE TABLE authority
(
id INT PRIMARY KEY AUTO_INCREMENT,
member_id INT NOT NULL REFERENCES member (id),
name VARCHAR(20) NOT NULL
);
2. MemberMapper์์ ๋ฉค๋ฒ ์์ด๋์ ์ํด ์ ์ฅ๋ ๊ถํ ์ ๋ณด ์กฐํํ๊ธฐ
@Select("""
SELECT name FROM authority WHERE member_id = #{memberId}
""")
List<String> selectAuthorityByMemberId(Integer memberId);
3. UseDetails์ ๊ถํ ์ฃผ์ ํ๊ธฐ
@Component
@RequiredArgsConstructor
public class CustomUserDetailsService implements UserDetailsService {
private final MemberMapper mapper;
@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
Member member = mapper.selectByEmail(username);
List<String> authority = mapper.selectAuthorityByMemberId(member.getId());
member.setAuthority(authority);
return new CustomUser(member);
}
}
4. ์ฌ์ฉ์ ๊ถํ ์ ์ฅ ๋ฐ ์์ฑ์๋ฅผ ํตํด ๊ถํ ์ ๋ฌ ๋ฐ๊ธฐ
@Getter
public class CustomUser extends User {
private Member member;
public CustomUser(Member member) {
super(member.getEmail(), member.getPassword(), member.getAuthority().stream().map(SimpleGrantedAuthority::new).toList());
this.member = member;
}
}
5. ํ์ ์ ๋ณด ํ์ด์ง๋ก ๋งํฌ ํ๊ณ ๋ค์ด๊ฐ ๋ admin์ผ ๋๋ง ๋ค์ด๊ฐ๋๋ก ์ค์ ํ๊ธฐ
@GetMapping("list")
@PreAuthorize("hasAnyAuthority('admin')")
public String list(Member member, Model model) {
model.addAttribute("memberList", service.list());
return "member/list";
}
6. ํ์ ์ ๋ณด ๊ด๋ฆฌ์๋ง ์ ๊ทผํ๊ธฐ
@GetMapping("")
public String view(Integer id, Authentication authentication, Model model) {
if (service.hasAccess(id, authentication) || service.isAdmin(authentication)) {
model.addAttribute("member", service.get(id));
return "member/info";
}
return "redirect:/";
}
public boolean isAdmin(Authentication authentication) {
Object principal = authentication.getPrincipal();
if (principal instanceof CustomUser user) {
return user.getAuthorities().stream().map(GrantedAuthority::getAuthority).anyMatch(authority -> authority.equals("admin"));
}
return false;
}
- ์ฌ์ฉ์๊ฐ ์๊ธด ๊ถํ ๋ชฉ๋ก์ ๊ฐ์ ธ์ ์ฌ์ฉ์๊ฐ ๊ฐ์ง ๊ถํ ์ค์ admin ๊ถํ์ด ์๋์ง ํ์ธํ์ฌ true์ด๋ฉด ์ฌ์ฉ์๊ฐ ๊ด๋ฆฌ์์
๋๋ค.
7. ํ์ ์ ๋ณด ์์ ์ ๋ณด ์ ๊ทผ ๊ฐ๋ฅ
<sec:authorize access="isAuthenticated()">
<sec:authorize access="hasAuthority('admin')">
<li class="nav-item">
<a href="/member/list" class="nav-link">
ํ์๋ชฉ๋ก
</a>
</li>
</sec:authorize>
</sec:authorize>
<sec:authorize access="isAuthenticated()">
<sec:authentication property="principal.member" var="authMember"></sec:authentication>
<li class="nav-item">
<a href="/member?id=${authMember.id}" class="nav-link">๋ด์ ๋ณด</a>
</li>
</sec:authorize>