UserDetailsService
既に特定したカスタム認証プロバイダー (の実装) の必要性に加えて、フレームワークが提供するデフォルトをもう少しカスタマイズすることで、これを行うことができます。
フレームワークは、インターフェースと、クラスなどのUserDetails
いくつかの実装を提供します。User
例
私のアプリケーションでは、必ずしもアプリケーションのユーザーでなくても人が必要でした。
私のやり方は、すでに提供されているSpring Security を拡張しUser
、UserDetailsService
実装でそれを返すようにすることでした。
public class RequestUserDetails
extends org.springframework.security.core.userdetails.User {
private static final long serialVersionUID = -6411988532329234916L;
private Integer personId;
public RequestUserDetails(String username, String password, Integer personId,
Collection<? extends GrantedAuthority> authorities) {
super(username, password, authorities);
this.personId = personId;
}
public Integer getPersonId() {
return personId;
}
}
+
@Service
public class UserSecurityService
implements org.springframework.security.core.userdetails.UserDetailsService {
[...]
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
[...]
return new RequestUserDetails(
userCreds.getLogin(),
userCreds.getPassword(),
person.getId(),
getAuthorities(domainUser.getRoles())
);
}
}
単純な使用法:
パラメーターを使用したコントローラー レベルjavax.security.Principal
(Spring MVC に関連付けられていない):
( (RequestUserDetails) ((Authentication)principal).getPrincipal() ).getPersonId()
パラメーターを使用して、Spring MVC@Controller
アノテーションに関連付けられたコントローラー レベルで:Authentication
( (RequestUserDetails)authentication.getPrincipal() ).getPersonId()
Spring Security に関する詳細なリファレンスが必要な場合は、 API javadocsUserDetails
にアクセスしてください。