Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Spring安全性:如何将额外的用户信息传递给JSP?_Java_Spring_Jsp_Spring Security - Fatal编程技术网

Java Spring安全性:如何将额外的用户信息传递给JSP?

Java Spring安全性:如何将额外的用户信息传递给JSP?,java,spring,jsp,spring-security,Java,Spring,Jsp,Spring Security,在JSP中,我可以通过${pageContext.request.remoteUser}获取用户名。但我还需要在网站的每个页面上显示其他信息(用户评级)。考虑到有一个@服务可以通过用户名获取它,我如何访问它 我使用自定义身份验证提供程序: @服务 公共类MyUserDetailsService实现UserDetailsService{ public UserDetails loadUserByUsername(字符串s)引发UsernameNotFoundException{ 返回新用户“密码”

在JSP中,我可以通过
${pageContext.request.remoteUser}
获取用户名。但我还需要在网站的每个页面上显示其他信息(用户评级)。考虑到有一个
@服务
可以通过用户名获取它,我如何访问它

我使用自定义身份验证提供程序:

@服务
公共类MyUserDetailsService实现UserDetailsService{
public UserDetails loadUserByUsername(字符串s)引发UsernameNotFoundException{
返回新用户“密码”、Arrays.asList(新的SimpleGrantedAuthority(“角色用户”));
}
}

您可以创建
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
实例获取当前登录的用户并执行一些逻辑。

您可以创建
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
属性。请注意,您还可以从
身份验证
实例获取当前登录的用户并执行一些逻辑。

您可以创建一个自定义的UserDetails类(例如MyUserDetails)并将额外信息保存在那里。在UserDetails服务中,只需返回此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();
获取当前委托人/用户详细信息,其中包含您的额外信息(例如,用户的评级)


p.s.如果此额外信息与用户相关,则会话不是存储此信息的正确位置,因为会话可能在关闭浏览器后过期。如果这些额外信息只是一些临时数据,那么@Branislav Lazic的答案是正确的。由于我无法添加注释,因此我必须在此处将注释写入@Branislav Lazic的答案。

您可以创建自定义UserDetails类(例如MyUserDetails)并将额外信息保存在此处。在UserDetails服务中,只需返回此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();
获取当前委托人/用户详细信息,其中包含您的额外信息(例如,用户的评级)


p.s.如果此额外信息与用户相关,则会话不是存储此信息的正确位置,因为会话可能在关闭浏览器后过期。如果这些额外信息只是一些临时数据,那么@Branislav Lazic的答案是正确的。因为我不能添加评论,所以我必须在这里将评论写到@Branislav Lazic的答案上。

供未来读者参考。注册
AuthenticationSuccessHandlerImpl
作为登录表单处理程序也很重要<代码>
@Jofsey是的。在注释配置的情况下,在
WebSecurityConfigurerAdapter
impl。类,您可以这样添加它:
http.formLogin().loginPage(“/login”).failureUrl(“/login?error”).successHandler(新的AuthenticationSuccessHandlerImpl())
,供将来的读者使用。注册
AuthenticationSuccessHandlerImpl
作为登录表单处理程序也很重要<代码>
@Jofsey是的。在注释配置的情况下,在
WebSecurityConfigurerAdapter
impl。类,您可以这样添加它:
http.formLogin().loginPage(“/login”).failureUrl(“/login?error”).successHandler(新的AuthenticationSuccessHandlerImpl())
我看不出有任何问题,无论这是否是一些临时数据。若会话过期,用户将被重定向到登录页面以续订会话,因此,它将重置额外的用户属性。在整个应用程序上下文中存储该属性可能非常危险@BranislavLazic根据我的理解,类似于用户评级的内容可以作为用户的属性持久保存在数据库中。它无论如何都会加载到
loadUserByUsername
函数中。如果它是在会话期间设置的,这意味着它可能在不同的会话中有所不同,这就是我所说的临时设置。在这种情况下,它当然应该存储在会话中,因为它是用户会话的属性。此外,重定向回登录页面和自动登录通常依赖于持久cookie。如果应用程序不提供该功能,则无法通过这种方式实现。即使您可以自动恢复会话,那么附加属性也位于所谓的“应用程序上下文”中,因为您可以随时检索它。SecurityContext通常设置为threadLocal,如果已配置,它也将保存在HttpSession中。嗯,它只能更安全。也许可以看看这个来解释一下。无论如何,这就是SpringSecurity提供给您使用的,为什么不简单地使用它呢?我看不出有什么问题,不管这是否是一些临时数据。若会话过期,用户将被重定向到登录页面以续订会话,因此,它将重置额外的用户属性。在整个应用程序上下文中存储该属性可能非常危险@BranislavLazic根据我的理解,类似于用户评级的内容可以作为用户的属性持久保存在数据库中。它无论如何都会加载到
loadUserByUsername
函数中。如果它是在会话期间设置的,这意味着它可能在不同的会话中有所不同,这就是我所说的临时设置。在这种情况下,它当然应该存储在会话中,因为它是用户会话的属性。此外,重定向回登录页面和自动登录通常依赖于持久cookie。如果应用程序不提供该功能,则无法通过这种方式实现。即使您可以自动恢复会话,那么附加属性也位于所谓的“应用程序上下文”中,因为您可以随时检索它。SecurityContext i