Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/11.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.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
如何使用spring security和Thymeleaf获取当前登录用户的ID_Spring_Spring Mvc_Spring Security_Thymeleaf - Fatal编程技术网

如何使用spring security和Thymeleaf获取当前登录用户的ID

如何使用spring security和Thymeleaf获取当前登录用户的ID,spring,spring-mvc,spring-security,thymeleaf,Spring,Spring Mvc,Spring Security,Thymeleaf,我在我的项目和视图中使用Spring安全性。我正在尝试获取当前登录用户的ID,以便将其用于我的某些方法 例如,我试图将用户添加到一个类中。在html部分,我有这样的按钮 <td th:each="user : ${user}"> <a th:href="@{/userList/{user_id}/saveClasses/{classes_id} (user_id=${user.id}, classes_id=${classes.id})}">Attend</

我在我的项目和视图中使用Spring安全性。我正在尝试获取当前登录用户的ID,以便将其用于我的某些方法

例如,我试图将用户添加到一个类中。在html部分,我有这样的按钮

<td th:each="user : ${user}">
    <a th:href="@{/userList/{user_id}/saveClasses/{classes_id} (user_id=${user.id}, classes_id=${classes.id})}">Attend</a>
</td>

当我运行代码时,我在数据库中为我的两个用户获得了两个出席按钮。
我想有一个按钮的用户,当然是目前登录。我该怎么做

要显示登录用户的用户名,我使用以下命令:

<span sec:authorize="isAuthenticated()"> 
    <a class="navbar-brand" href="#">Hello <span sec:authentication="name"></span></a>
</span>

据我所知,在
${user}
下,您有数据库中的用户列表。 我在这里看到两种选择

  • 您可以向控制器中当前登录的用户添加以下内容:

    public String foo(Model model) {
        User user = (User)SecurityContextHolder.getContext().getAuthentication().getPrincipal();
        String username = user.getUsername();
        model.addAttribute("username", username);
        return "your_view";
    }
    
    然后在html中:

    <td th:each="user : ${user}">
        <a th:if="${username == user.username}" th:href="@{/userList/{user_id}/saveClasses/{classes_id} (user_id=${user.id}, classes_id=${classes.id})}">Attend</a>
    </td>
    
  • 若你们们有数据库,你们们可能有模型——你们们可以找到详细的描述,如何用你们们的自定义类为用户实现它。1和2选项在您的情况下是最简单的,但这一个更优雅

  • 在我的解决方案中,来自数据库的用户需要字段
    username

    另外,我建议将用户列表保存在名为
    users
    的变量中,而不是od
    user
    ——这样更易于阅读。

    解决方案


    在花了几个小时试图找到答案后,我终于找到了适合我的解决方案

    我已经使用存储库完成了这项工作,这是我的实现:

    UserRepository.java

    @Repository
    public interface UserRepository extends CrudRepository<User, Long>, UserDetailsService {
    
         public User findUserByUsername(String username);
    
    }
    
    @RequestMapping("/dashboardUser")
        public String dashboardPageList(Model model, @AuthenticationPrincipal UserDetails currentUser ) {
        User user = (User) userRepository.findUserByUsername(currentUser.getUsername());
            model.addAttribute("currentStudent", user);
    
            return "dashboardUser";
        }
    
    }

    controller.java

    @Repository
    public interface UserRepository extends CrudRepository<User, Long>, UserDetailsService {
    
         public User findUserByUsername(String username);
    
    }
    
    @RequestMapping("/dashboardUser")
        public String dashboardPageList(Model model, @AuthenticationPrincipal UserDetails currentUser ) {
        User user = (User) userRepository.findUserByUsername(currentUser.getUsername());
            model.addAttribute("currentStudent", user);
    
            return "dashboardUser";
        }
    
    在.html文件中,我这样显示它

    <div class="form-group label-floating">
        <label>Username</label> 
        <input type="text" name="username" 
        th:value="${currentStudent.username}"/>
    </div>
    
    
    用户名
    
    使用第一个选项,如何获取当前登录用户的ID?我能看到的就是用户名,就是它。我已经做到了。在第二个选项中,我会得到ID吗?使用
    th:each=“user:${user}”
    我将再一次在行中设置出席按钮的数量,因为我将用户存储在数据库中。我只想从当前登录的用户@NequeqI添加了它,但我得到了这个错误:
    ClassCastException:org.springframework.security.core.userdetails.User不能转换为com.oggi.model.User
    你知道为什么吗?好的,我犯了一个错误
    SecurityContextHolder.getContext().getAuthentication().getPrincipal()
    返回实现
    接口用户详细信息的
    类。您的类必须实现此接口,然后您应该能够将其转换为
    UserDetails
    ,而不是
    User
    。试试这个,让我知道。我有一个问题,这个方法是在我的控制器。我再次更新了我的问题以显示它的样子。当我用这行代码实现UserDetails时
    long id=user.getId()我无法获取ID我只能获取权限()、类()、密码()和用户名()@你有完整的例子。