Adi*_*ram 2 spring spring-mvc spring-security spring-webflow
我正在寻找使用 Spring Security 在整个应用程序中存储和显示登录用户的其他详细信息的正确方法。
例如,我想在每一页的顶部显示Welcome:Mr.Smith(管理员,数学部)。为此,我想获取登录用户的前缀、姓氏、名称和部门。
我正在使用自定义UserDetails服务从数据库中获取用户。在浏览时,我发现AuthenticationhasgetDetails()可以存储与身份验证相关的其他详细信息,我可以使用该方法存储其他详细信息吗?
如果是,你能举一个简单的例子吗?我可以AuthenticationSuccessHanlder用来做这项工作,还是我以完全错误的方式看待问题?我不应该在 spring 安全层处理这个吗?我应该在哪里照顾它?
除了需要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;
}
}
Run Code Online (Sandbox Code Playgroud)
+
@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())
);
}
}
Run Code Online (Sandbox Code Playgroud)
简单用法:
在带有javax.security.Principal参数的控制器级别(不绑定到 Spring MVC):
( (RequestUserDetails) ((Authentication)principal).getPrincipal() ).getPersonId()
Run Code Online (Sandbox Code Playgroud)在绑定到 Spring MVC@Controller注释的控制器级别,带有一个Authentication参数:
( (RequestUserDetails)authentication.getPrincipal() ).getPersonId()
Run Code Online (Sandbox Code Playgroud)如果您需要有关 Spring Security 的进一步参考,UserDetails请访问API javadocs
| 归档时间: |
|
| 查看次数: |
4151 次 |
| 最近记录: |