添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
相关文章推荐
近视的沙发  ·  react ...·  8 月前    · 
老实的水煮肉  ·  DataGrid ...·  1 年前    · 

在spring security,用SecurityContextHolder.getContext().getAuthentication().getPrincipal()获取登录用户的信息,发现获取到的用户有串值现象——获取用户信息,发现获取到的是别人的信息,偶发性还有取值为null的情况。经同事提醒,是不是用了多线程,查到了问题的原因。

//原代码
ExecutorService executorService = Executors.newCachedThreadPool(new ThreadFactoryBuilder().setNameFormat("job").build());
executorService.execute(() -> {
       //获取用户对象
       LoginUserDetails userDetails = (LoginUserDetails)SecurityContextHolder.getContext()
                .getAuthentication().getPrincipal();
//改进后
ExecutorService executorService = Executors.newCachedThreadPool(new ThreadFactoryBuilder().setNameFormat("job").build());
SecurityContext securityContext = SecurityContextHolder.getContext();
executorService.execute(() -> {
       //把context设置进去
       SecurityContextHolder.setContext(securityContext);
       //获取用户对象
       LoginUserDetails userDetails = (LoginUserDetails)SecurityContextHolder.getContext()
                .getAuthentication().getPrincipal();

ThreadLocal是线程独有的局部变量,只针对当前线程,当前代码里使用了嵌套线程,子线程里的SecurityContext和父线程里的SecurityContext不是同一个,需要从父线程把SecurityContext传入到子线程

在spring security,用SecurityContextHolder.getContext().getAuthentication().getPrincipal()获取登录用户的信息,发现获取到的用户有串值现象——获取用户信息,发现获取到的是别人的信息,偶发性还有取值为null的情况。经同事提醒,是不是用了多线程,查到了问题的原因。//原代码ExecutorService executorService = Executors.newCachedThreadPool(new Thread. 方法1:通过 Authentication.getPrincipal() 获取用户信息 (1)通过Authentication.getPrincipal()可以获取到代表当前用户的信息,这个对象通常是UserDetails的实例。通过UserDetails的实例我们可以获取到当前用户的用户名、密码、角色等信息。 Spring Security使用一个Authentication对象来描述当...
今天使用Spring security获取当前用户信息时发现拿不到 Principal值为空并且报异常 前面我通过Spring Security的全局上下文设置 UsernamePasswordAuthenticationToken usernamePasswordAuthenticationToken= new UsernamePasswordAuthenticationToken(userDetails,null,userDetails.getAuthorities());
做项目的时候,从前端传递时间参数到spring的controller,结果得到对象的时间结果不对(因为前端接收的格式是Date类型的而非String类型),错误如下图所示: 而其实完整的要传递的时间是:2015-07-31 15:07:48解决办法是在controller加上如下代码: @InitBinder protected void initBinder(HttpServ
"status": 403, "error": "Forbidden", "message": "Expected CSRF token not found. Has your session expired?", "path": "/article/get&q
Spring Security 中,要获取用户的权限可以通过以下步骤来实现: 1. 配置 Spring Security:首先,你需要在 Spring Security 的配置中定义用户的权限信息。这可以通过编写一个实现了 `UserDetailsService` 接口的自定义类来实现。在这个类中,你可以从数据库或其他数据源中获取用户的权限信息,并将其返回给 Spring Security。 2. 获取当前认证的用户:在需要获取用户权限的地方,你可以使用 `SecurityContextHolder` 类的静态方法 `getContext()` 获取当前认证的安全上下文对象。然后,可以通过调用 `getAuthentication()` 方法来获取当前认证的用户信息。 3. 获取用户权限:从上一步中获取到的用户信息中,你可以调用 `getAuthorities()` 方法来获取用户所拥有的权限列表。这个方法将返回一个 `Collection<? extends GrantedAuthority>` 类型的对象,其中包含了用户的权限信息。 以下是一个示例代码,演示了如何获取当前认证用户的权限: ```java import org.springframework.security.core.Authentication; import org.springframework.security.core.GrantedAuthority; import org.springframework.security.core.context.SecurityContextHolder; // 获取当前认证用户的权限 public Collection<? extends GrantedAuthority> getCurrentUserAuthorities() { Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); if (authentication != null) { return authentication.getAuthorities(); return null; 请注意,以上代码中的 `getAuthorities()` 方法返回的是一个权限列表,每个权限都是一个 `GrantedAuthority` 对象。你可以根据具体需求进一步处理这些权限信息。 希望这个回答能够帮助到你!如果你还有其他问题,请随时提问。
问题解决:Unlink of file '.git/objects/pack/pack-***.pack' failed. Should I try again? (y/n) y 43472