除了需要您已经确定的自定义身份验证提供程序(的实现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 的进一步参考,UserDetails
请转到API javadocs