博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Spring Boot+Spring Security+MySql实现用户权限管理(2)
阅读量:2441 次
发布时间:2019-05-10

本文共 3611 字,大约阅读时间需要 12 分钟。

基于与MySql实现用户的认证和授权

实体类

对于要添加进Spring Security上下文的实体类,首先要实现一个接口类UserDetails

具体源码:

public interface UserDetails extends Serializable {
Collection
getAuthorities(); String getPassword(); String getUsername(); boolean isAccountNonExpired(); boolean isAccountNonLocked(); boolean isCredentialsNonExpired(); boolean isEnabled();}

从上往下依次功能为:

1 根据自定义逻辑来返回用户权限,如果用户权限返回空或者和拦截路径对应权限不同,验证不通过

2返回具体用户密码

3返回具体用户密码

4帐号是否不过期,false则验证不通过

5帐号是否不锁定,false则验证不通过

6凭证是否不过期,false则验证不通过

7该帐号是否启用,false则验证不通过

看一个具体的实体类User:

@Entity@Table(name = "user1") //设置对应表名字public class User implements UserDetails{
//主键及自动增长 @Id @GeneratedValue private long id; private String name; private String password; //多对多映射,用户角色 @ManyToMany(cascade = {CascadeType.REFRESH},fetch = FetchType.EAGER) private List
roles; public long getId() { return id; } public void setId(long id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public List
getRoles() { return roles; } public void setRoles(List
roles) { this.roles = roles; } //获取当前用户实例的password @Override public String getPassword() { return this.password; } public void setPassword(String password) { this.password = password; } public User(String name, String password) { this.name = name; this.password = password; } public User() { } //根据自定义逻辑来返回用户权限,如果用户权限返回空或者和拦截路径对应权限不同,验证不通过 @Override public Collection
getAuthorities() { List
authorities = new ArrayList<>(); List
roles = this.getRoles(); for (Role role : roles) { authorities.add(new SimpleGrantedAuthority(role.getRolename())); } return authorities; } //获取当前用户实例的name @Override public String getUsername() { return this.name; } //帐号是否不过期,false则验证不通过 @Override public boolean isAccountNonExpired() { return true; } //帐号是否不锁定,false则验证不通过 @Override public boolean isAccountNonLocked() { return true; } //凭证是否不过期,false则验证不通过 @Override public boolean isCredentialsNonExpired() { return true; } //该帐号是否启用,false则验证不通过 @Override public boolean isEnabled() { return true; }}

还有角色类实体Role:

@Entity@Table(name = "role1")public class Role {
@Id @GeneratedValue private long id; private String rolename; public long getId() { return id; } public void setId(long id) { this.id = id; } public String getRolename() { return rolename; } public void setRolename(String rolename) { this.rolename = rolename; }}

接下来要实现一个类,实现接口类UserDetailsService

看下源码:

public interface UserDetailsService {//根据用户名定位用户。在实际的实现中,搜索可能是区分大小写的,或者是区分大小写的,这取决于如何配置实现实例。在本例中,返回的UserDetails对象可能具有与实际请求的不同的用户名。    UserDetails loadUserByUsername(String var1) throws UsernameNotFoundException;}

它是加载用户特定数据的核心接口。

它在整个框架中作为用户DAO使用,是DaoAuthenticationProvider使用的策略。

该接口只需要一个只读方法,这简化了对新的数据访问策略的支持。

具体实现后的Service类:

public class SecurityService implements UserDetailsService{
//DAO类,帮助实现从数据库查找对应名字的实体类 @Autowired private UserRepository userRepository; @Override public UserDetails loadUserByUsername(String s) throws UsernameNotFoundException { User user = userRepository.findByName(s); if (user == null) { throw new UsernameNotFoundException(""); } return user; }}

转载地址:http://kxcqb.baihongyu.com/

你可能感兴趣的文章
虚拟dom_虚拟DOM
查看>>
安卓录制视频不录制外界声音_我如何录制我的视频
查看>>
vue组件引入scss变量_如何将SCSS与Vue.js单个文件组件一起使用
查看>>
node.js删除文件_如何使用Node.js删除文件
查看>>
开发人员,学习营销
查看>>
webassembly_WebAssembly简介
查看>>
react useref_如何使用useRef React钩子
查看>>
axios 请求node_使用Axios的Node中的HTTP请求
查看>>
node http模块_Node http模块
查看>>
如何使用Hugo建立博客
查看>>
macos sqlite_如何在macOS上安装SQLite
查看>>
setimmediate_了解setImmediate()
查看>>
npm 语义化发布_使用npm的语义版本控制
查看>>
git可视化工具使用_使用Go可视化您本地的Git贡献
查看>>
JavaScript中的call()和apply()
查看>>
node 发出ajax请求_使用Node发出HTTP请求
查看>>
Object isSealed()方法
查看>>
成为独立开发者
查看>>
http与https_HTTP与HTTPS
查看>>
node.js运行js_Node.js运行时v8选项列表
查看>>