在JSP中,我可以通过${pageContext.request.remoteUser}
获取用户名。但是我还需要在我网站的每个页面上显示其他信息(用户评级)。我如何访问它,考虑到@Service
可以通过用户名获取它?
我需要使用自定义身份验证提供程序:
@Service
public class MyUserDetailsService implements UserDetailsService {
public UserDetails loadUserByUsername(String s) throws UsernameNotFoundException {
return new User(s, "password", Arrays.asList(new SimpleGrantedAuthority("ROLE_USER")));
}
}
<security:authentication-manager>
<security:authentication-provider user-service-ref='myUserDetailsService'/>
</security:authentication-manager>
答案 0 :(得分:2)
您可以创建AuthenticationSuccessHandler
的实现并在那里设置属性:
@Component
public class AuthenticationSuccessHandlerImpl implements AuthenticationSuccessHandler {
Override
public void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response,
Authentication authentication) throws IOException, ServletException {
request.getSession().setAttribute("someDetail", "detailsValue");
response.sendRedirect("/to-whatever-url-you-want")
}
}
成功登录后,将设置someDetail
属性。请注意,您还可以从Authentication
实例获取当前登录的用户并执行一些逻辑。
答案 1 :(得分:2)
您可以创建自定义UserDetails类(例如MyUserDetails)并在那里保存额外信息。在UserDetailsService中,只返回此MyUserDetails而不是普通的UserDetail。
public class MyUserDetails extends UserDetail {
private int rating;
... // other properties
... // getter setter
}
@Service
public class MyUserDetailsService implements UserDetailsService {
public UserDetails loadUserByUsername(String s) throws UsernameNotFoundException {
return new MyUserDetails(...);
}
}
在每个控制器中,您都可以拨打
(MyUserDetails)SecurityContextHolder.getContext().getAuthentication().getPrincipal();
获取当前主体/ UserDetails,其中包含您的额外信息(例如用户的评级)。
P.s。如果此额外信息与用户相关,则会话不是存储它的正确位置,因为会话可能会在关闭浏览器后过期。如果这些额外的信息只是一些临时数据,那么@Branislav Lazic的答案是正确的。由于我无法添加评论,所以我必须在@Branislav Lazic的答案中写下评论。