在springboot项目中的controller层可以通过
@RequestAttribute
(Requests.
CURRENT_USER
) ItBaseUser user 获取用户对象信息,但很多时候需要在service层用到当前用户的信息;
1、先来看下登录时存入用户信息到cookie中
CookieUtil.setCookie(response, Cookies.USER_COOKIE, Base64Util.encoder(String.valueOf(user.getUid())));
2、在用户调用其他方法时,要先认证当前用户信息,通过对cookie的认证后,可以到数据库中进行查询获取用户的实体对象的全部信息,然后将用户对象存入到request中
request.setAttribute(Requests.CURRENT_USER, user);
3、在controller层中按如下方式进行获取
@RequestAttribute(Requests.CURRENT_USER) ItBaseUser user
4、如果每次在service层中使用都要从controller层进行传递,就显得比较麻烦,可以采用以下方法在service层进行用户信息的获取;
1>新建一个类,来获取用户对象信息
public class UserRequest {
public static ItBaseUser getCurrentUser(){
HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
ItBaseUser user = (ItBaseUser)request.getAttribute(Requests.CURRENT_USER);
return user;
2>可以直接在service层中进行用户信息对象的获取
ItBaseUser user = UserRequest.getCurrentUser();
使用spring oauth2框架做授权鉴定。想获取当前用户信息怎么办?
我们知道spring oauth2是基于spring security的实现的。
spring security可以通过SecurityContextHolder.getContext().getAuthentication().getPrincipal()获取到当前用户信息。
而spring oauth2通过SecurityContextHolder.getContext().getAuthentication().getPrincipal()却只能拿到当前用户的用户名。
然而实际开发过程中,我们较常用到的大部分都是用户的id。
那么怎么通过配置获取当前用户的信息呢?
如果你需要从其他非Controller组件(如另一个Service或组件)调用Service层的方法,你可以通过相同的方式注入Service。注解,它告诉Spring这是一个Service组件,应该被管理在Spring容器中。首先,你需要定义一个Service接口,其中包含你需要实现的方法。时,Controller会调用Service层中的。在你的Controller中,你可以使用。注解来注入Service。
在Spring Boot中,获取登录用户的个人信息通常需要使用Spring Security框架来进行身份认证和授权。Spring Security提供了一个名为SecurityContextHolder的上下文对象,它包含了当前请求的身份认证信息。通过SecurityContextHolder,可以访问当前已认证的用户的信息。
使用JWT生成token,并在controller中通过注解判断登录权限,自动在需要登录的api中获取用户信息,支持分布式登录。
废话不多说,直接上链接sunxy0617/jinwu_admin: JWT使用学习 (github.com)
SecurityContextHolder.getContext().getAuthentication().getPrincipal();
获取登录用户的用户名:getPrincipal()
获取通过身份验证的用户的密码:getCredentials()
获取已认证用户的分配角色:getAuthorities()
/用来跳过验证的PassToken @Target({@Data @ApiModel("返回结果") public class R < T > {/*** 错误码*/ @ApiModelProperty("错误码") private Integer code;/*** 错误消息*/ @ApiModelProperty("错误消息") private String msg;/*** 内容*/ @ApiModelProperty("内容") private T data;
* Description: 用ThreadLocal提供一个存储线程内变量的地方.
* 客户端代码可以用静态方法存储和获取线程内变量,不需要依赖于HttpSession.
* web层的Controller可通过此处向business层传入user_id之类的变量
@SuppressWarnings("unchecked")
public
2.使用Threadlocal线程,请求产生响应前,处于同一个线程中。
比如在一个登录拦截器中,在preHandle方法中登录成功后,放行前,想把user对象传到controller或service中
新建类 LoginInterceptor
public class LoginInterceptor extends H...