Java 如何显示当前登录用户';s所有模板中的信息,包括Spring安全应用程序中由WebMVCConfigureAdapter管理的视图

Java 如何显示当前登录用户';s所有模板中的信息,包括Spring安全应用程序中由WebMVCConfigureAdapter管理的视图,java,spring,spring-mvc,spring-security,thymeleaf,Java,Spring,Spring Mvc,Spring Security,Thymeleaf,我有一个Spring引导应用程序,它使用Spring安全性和Thymeleaf模板。当控制器由WebConfigureAdapter的子类管理时,我试图在模板中显示登录用户的名字和姓氏 假设我的WebConfigureAdapter子类如下所示 @Configuration public class MvcConfig extends WebMvcConfigurerAdapter{ @Override public void addViewControllers(ViewCo

我有一个Spring引导应用程序,它使用Spring安全性和Thymeleaf模板。当控制器由WebConfigureAdapter的子类管理时,我试图在模板中显示登录用户的名字和姓氏

假设我的WebConfigureAdapter子类如下所示

@Configuration
public class MvcConfig extends WebMvcConfigurerAdapter{

    @Override
    public void addViewControllers(ViewControllerRegistry registry){
        registry.addViewController("/some-logged-in-page").setViewName("some-logged-in-page");
        registry.addViewController("/login").setViewName("login");

    }
    ....
}
@Entity
@Table(name = "user")
public class User {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id", nullable = false, updatable = false)
    private Long id;



    @Column(name="first_name", nullable = false)
    private String firstName;


    public String getFirstName() {
        return firstName;
    }
    ...
}
我的用户实体类如下所示

@Configuration
public class MvcConfig extends WebMvcConfigurerAdapter{

    @Override
    public void addViewControllers(ViewControllerRegistry registry){
        registry.addViewController("/some-logged-in-page").setViewName("some-logged-in-page");
        registry.addViewController("/login").setViewName("login");

    }
    ....
}
@Entity
@Table(name = "user")
public class User {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id", nullable = false, updatable = false)
    private Long id;



    @Column(name="first_name", nullable = false)
    private String firstName;


    public String getFirstName() {
        return firstName;
    }
    ...
}
在我的模板中,我尝试使用如下代码

<div sec:authentication="firstName"></div> 
然后使用以下代码访问模板中的详细信息:

<span th:text ="${currentUser.getUser().getFirstName()}"></span>

但这不适用于我的类MvcConfig注册的任何视图控制器。相反,我需要确保我的每个控制器都是独立的类


那么,有没有人能告诉我一种方法,可以自动将登录用户的详细信息插入我的视图,例如本例中的some-logged-page.html?谢谢

多亏了巴拉吉·克里希南的提示,完成这项任务非常容易

基本上,我必须将Thymeleaf Spring安全集成模块添加到build.gradle文件中,如下所示:

@ControllerAdvice
public class CurrentUserControllerAdvice {
    @ModelAttribute("currentUser")
    public UserDetails getCurrentUser(Authentication authentication) {
        return (authentication == null) ? null : (UserDetails) authentication.getPrincipal();
    }
}
compile("org.thymeleaf.extras:thymeleaf-extras-springsecurity3")
然后在我的模板中,我只使用了以下标记:

<span th:text ="${#authentication.getPrincipal().getUser().getFirstName()}"></span>

使用Spring Security 4和Thymeleaf 3时:

<span th:text="${#authentication.getPrincipal().getUsername()}"></span>

这个结构适合我(spring boot 1.5和2.0/thymeleaf 3):
此处有记录(页面底部)

登录用户:Bob
不要忘记在视图的html部分包含sec标记:

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org"
      xmlns:sec="http://www.thymeleaf.org/extras/spring-security">
<head>
</head>
<body>

我希望这有帮助
祝你今天愉快

Thomas

正如@B378所说,当使用SpringSecurity4和Thymeleaf3时:您必须使用以下命令

<span th:text="${#authentication.getPrincipal().getUsername()}"></span>


因为spring安全性在内部使用UserDetails。UserDetails包含一个名为getUsername()的函数。

此页面非常有用。谢谢你的回复。 请注意,如果您使用的是最新的Spring Boot,即版本
2.1.0
,则需要使用以下内容:
thymeleaf-extras-springsecurity5


对于我来说,在使用Spring boot 2.1.2时,我需要使用以下工具

<span th:text="${#authentication.getPrincipal()}"></span> <!-- No ".getUsername()"-->


使用Spring boot 2.2.1时,使用thymeleaf-extras-springsecurity5

对于maven,将这些行添加到pom.xml


org.thymeleaf.extras
thymeleaf-extras-springsecurity5

在胸腺里


对于thymleaf 4及更高版本,您必须修改一些类才能获得信息。以下是如何做到这一点:

首先,在UserDetails类中添加用户的getter
getUser(){return this.user;}
,然后将该对象推送到UserDetailsService对象中。如果没有这些更改,thymleaf将无法解析HTML文件

然后您可以获得以下信息:


如何将用户详细信息添加到Cookie中,域内的每个网页都可以访问该Cookie?使用spring security taglib。。。考虑到您正在使用thymeleaf作为模板,请参阅:@AadityaGavandalkar。谢谢你的建议。我想我可以在cookie中设置数据,并通过JavaScript读取数据,但我相信应该有一种不错的方式来访问相同的数据服务器端。例如,在PHP中,我们可以在$_会话中设置数据,并在任何视图中访问它。@BalajiKrishnan。谢谢。我试着使用sec:authentication标签,但找不到获取所需信息的方法。也许您可以写一个答案,说明如何获得自定义信息,如我的示例中的firstName?Thankso已经有了答案-解释更多关于你的答案你知道如何利用用户的角色做到这一点吗?比如说鲍勃当然。只要使用这个:
[ROLE\u USER,ROLE\u ADMIN]
就可以了。以下是一些要查找的提示:。我希望这有帮助。