在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