Spring Security:如何将其他用户信息传递给JSP?

时间:2017-03-04 15:16:11

标签: java spring jsp spring-security

在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>

2 个答案:

答案 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)并在那里保存额外信息。在UserDetailsS​​ervice中,只返回此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的答案中写下评论。