SpringBoot项目实战(008)Spring Security(二)JWT

SpringSecurity && JWT

上一章SpringBoot项目实战(007)Spring Security(一)中,实现了Spring Security的数据库认证。本章采用JWT实现无状态服务的认证和鉴权。

改造流程

  1. 服务改为STATELESS,不再使用session
  2. 数据库中Users表增加token,相应代码调整。后期可以改为token存在redis中。
  3. 新增一个JwtUtils,封装常用的jwt操作
  4. 初次请求登录时,获得一个新的jwttoken,并存入数据库。
  5. 再次请求API时,解析jwttoken,获得用户名,再从数据库载入权限。

无状态服务

现在微服务盛行,大部分RESTFUL API都是采用STATELESS的方式。比如在WebSecurityConfigurerAdapter中:

public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
   
    ......
    @Override
    protected void configure(HttpSecurity http) throws Exception {
   
        http.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS);
    ......
    }
    ......
}

加入以上代码后,即便你在login页面完成登录,也会在其他需要认证的页面弹出401,这是因为认证成功的SESSION并没有被保留。所以我们需要通过一个Token来传递信息。

数据库及mybatis调整

数据库新增字段Token

CREATE TABLE `Users` (
  `UserId` int(11) NOT NULL AUTO_INCREMENT,
  `UserName` varchar(45) NOT NULL,
  `PassWord` varchar(100) NOT NULL,
  `LockedFlag` tinyint(4) NOT NULL,
  `Token` varchar(200) DEFAULT NULL,
  PRIMARY KEY (`UserId`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8;

Bean

对应的,bean中添加一个字段:

//UserBean
@Data
@Accessors(chain = true)
@SuppressWarnings("serial")
public class UserBean implements Serializable {
   
    private int  userId;
    private String userName;
    private String passWord;
    private int lockedFlag;
    private String token;
}
//UserCondition
@Data
@Accessors(chain = true)
public class UserCondition extends BaseCondition {
   
    private int  userId;
    private String userName;
    private String passWord;
    private int lockedFlag;
    private String token;

    @Override
    public Class<?> getChildClass() {
   
        return UserBean.class;
    }
}

controller dao service

对应的controller(用于测试)、dao、service中增加方法getUserByToken:

//usercontroller
@RestController
@RequestMapping(value = "/user")
public class UserController extends BaseController<UserBean,UserCondition,IUserService>{
   
    ......
    @RequestMapping(value = "/token/{token}", method = RequestMethod.GET)
    public UserBean getUserByToken(@PathVariable(value = "token") String token) {
   
        return baseService.getUserByToken(token);
    }
}

//IUserService
public interface IUserService extends IBaseService<UserBean,UserCondition>  {
   
    UserBean findByName(String username);
    UserBean getUserByToken(String token);
}

//UserServiceImpl
@Service
public class UserServiceImpl implements IUserService {
   
    ......
    @Override
    public UserBean getUserByToken(String token) {
   
        return userDao.getUserByToken(token);
    }
}

//userdao
public interface UserDao extends IBaseDao<UserBean,UserCondition> {
   
    UserBean findByName(@Param("username") String username);
    UserBean getUserByToken(@Param("token"
  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值