👍SpringSecurity单体项目最佳实践

SpringSecurity单体项目最佳实践到这里,我们的SpringSecurity就已经完结啦 , 文章中可能有些地方不能做到全面覆盖,视频教程地址

  • 初始项目地址
  • 完成项目地址
1、搭建环境
  • 建议下载初始项目,跟着文章一步一步搭建 。加深对于SpringSecurity的理解 。
  • 需要将application.properties的数据库配置,改成您自己对应的信息
  • 如若依赖问题 , 修改Idea Maven,改成自己的
  • 还需将Jdk版本改成您自己所使用的的版本 。项目使用的是JDK12
  • 数据库脚本在完成项目中的sql文件中
2、简单使用
  • 添加SpringSecurity依赖
  • 注:这里没有申明版本号,是由于我们项目继承的SpringBoot父项目,它已经为我们适配了对于的版本 。
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-security</artifactId></dependency>【👍SpringSecurity单体项目最佳实践】然后启动项目即可:
  • ? 观察控制台:这是SpringSecurity为我们临时生成的密码,默认用户名为user

&#128077;SpringSecurity单体项目最佳实践

文章插图
  • ? 回到浏览器 , 输入http://localhost:8080/community,由于我们此时还未登陆,会重定向到默认创建的登陆页面中 , 这是SpringSecurity默认为我们做的 。
  • 输入控制台的密码 , 即可进入到系统,

&#128077;SpringSecurity单体项目最佳实践

文章插图
3、自定义使用
  • 相信小伙伴们已经对SpringSecurity已经有了初步的了解,但是正常的项目中 , 不可能采用这个默认登陆页面呀 , 这点SpringSecurity也早就想到了 。
  • 当然可以自定义登陆页面,但是在自定义登陆页面之前,我们需要简单处理一下我们的实体类 。
在用户登录时,系统会根据用户名,从存储设备查找该用户的密码及权限等,将其组装成一个UserDetails对象 。并用UserDetails中的数据对用户进行认证 , 决定其输入的用户名/密码是否正确 。
  • 观察UserDetails结构
public interface UserDetails extends Serializable { Collection<? extends GrantedAuthority> getAuthorities();//权限 String getPassword();//密码 String getUsername();//用户名 boolean isAccountNonExpired();//账号是否未过期 boolean isAccountNonLocked();//账号是否未锁定 boolean isCredentialsNonExpired();//密码是否未过期 boolean isEnabled();//是否激活
  • 里面定义了许多关于用户的信息 , 可以看到它是一个接口,并不能直接使用 。那么肯定就有默认的实现类,要不然我们上面的登陆功能是怎么完成的呢 。
  • ? 此项目中采用 实体类继承它的方式来完成 。
@Datapublic class User implements UserDetails {private int id;private String username;private String password;private String salt;private String email;private int type; // 1 管理员 2普通用户private int status;private String activationCode;private String headerUrl;private Date createTime;//权限@Overridepublic Collection<? extends GrantedAuthority> getAuthorities() {List<GrantedAuthority> permissions = new ArrayList<>();permissions.add((GrantedAuthority) () -> {switch (type) { //case 1:return "ADMIN";default:return "USER";}});return permissions;}// true 帐户未过期@Overridepublic boolean isAccountNonExpired() {return true;}// true 帐户未锁定@Overridepublic boolean isAccountNonLocked() {return true;}// true 凭证未过期@Overridepublic boolean isCredentialsNonExpired() {return true;}// true 账号是否可用@Overridepublic boolean isEnabled() {return true;}}
  • ? 定义了UserDetails之后,当然还远远不够,哪个方法查询数据库来获取我们的用户信息呢?就是Security中的UserDetailsService接口

&#128077;SpringSecurity单体项目最佳实践

文章插图
  • ? 它肯定也有默认实现类的 , 但是我们需要查询数据库对应的用户数据,所以我们还是采用自定义的方式去完成 。
@Servicepublic class UserService implements UserDetailsService {@Resourceprivate UserMapper userMapper;// 根据用户名去查询用户数据public User findUserByName(String username) {return userMapper.selectByName(username);}@Overridepublic UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {return this.findUserByName(username);}}

推荐阅读