私のアプリケーションでは、通常、アクセス管理用に 3 つのテーブルを作成します。役割、権利、および役割と権利の間をマッピングする関連テーブル。
私はこのアプローチを Spring セキュリティに翻訳しようとしていますが、[この記事][1] を読んだ後、正しい道を進んでいると思いました。カスタム AuthenticationProvider を作成し、authenticate()
次のようにメソッドを実装しました。
@Override
public Authentication authenticate(Authentication authentication) throws AuthenticationException {
UserProfile profile = userProfileService.findByEmail(authentication.getPrincipal().toString());
if(profile == null){
throw new UsernameNotFoundException(String.format("Invalid credentials", authentication.getPrincipal()));
}
String suppliedPasswordHash = DigestUtils.shaHex(authentication.getCredentials().toString());
if(!profile.getPasswordHash().equals(suppliedPasswordHash)){
throw new BadCredentialsException("Invalid credentials");
}
UsernamePasswordAuthenticationToken token = new UsernamePasswordAuthenticationToken(profile, null, profile.getAuthorities());
return token;
}
このprofile.getAuthorities()
メソッドは、権利のリストを作成します (権利は、GrantedAuthority の独自の実装でラップされます)。したがって、このリストを使用して UsernamePasswordAuthenticationToken オブジェクトが作成されます。これは、これを処理する UserProfile.getGrantedAuthorities() メソッドです。
public Collection<? extends GrantedAuthority> getAuthorities() {
Set<ProduxAuthority> authorities = new HashSet<ProduxAuthority>();
for (Role role : roles) {
for (Right right : role.getRights()) {
ProduxAuthority produxAuthority = new ProduxAuthority(right.getName());
authorities.add(produxAuthority);
}
}
return authorities;
}
私の質問は、これが正しいアプローチかどうかです。権限の代わりに GrantedAuthorities にロールを詰め込む必要があるという印象を受けていますが、権限を使用してメソッドと URL を保護したいと考えています。どうすればこれを達成できますか? そして、Spring の ROLE と PERMISSION の違いは何ですか? パーミッションは権利にマップされますか? hasPermission() を使用して、役割ではなく権利に基づいて物事を保護できますか?