先说一下AuthConfig.java Spring Security的主要配置文件之一 AuthConfig

 1 @Configuration
2 @EnableWebSecurity
3 public class AuthConfig extends WebSecurityConfigurerAdapter {
4 @Override
5 protected void configure(HttpSecurity httpSecurity) throws Exception {
6 httpSecurity.authorizeRequests()
7 .antMatchers("/css/**","/staic/**", "/js/**","/images/**").permitAll()
8 .antMatchers("/", "/login","/session_expired").permitAll()
9 .and()
10 .formLogin()
11 .loginPage("/login")
12 .defaultSuccessUrl("/main_menu")
13 .failureUrl("/loginError")
14 .usernameParameter("txtUserCd")
15 .passwordParameter("txtUserPwd")
16 .permitAll()
17 .and()
18 .logout()
19 .logoutRequestMatcher(new AntPathRequestMatcher("/logout"))
20 .logoutSuccessUrl("/")
21 .deleteCookies("JSESSIONID")
22 .invalidateHttpSession(true)
23 .permitAll()
24 .and()
25 .sessionManagement()
26 .invalidSessionUrl("/session_expired")
27 .maximumSessions(1)
28 .maxSessionsPreventsLogin(true)
29 .expiredUrl("/session_expired");
30 httpSecurity.logout().permitAll();
31
32 }
33
34 @Autowired
35 AuthUserService authUserService;
36 public void globalAuthConfig(AuthenticationManagerBuilder auth) throws Exception {
37 auth.userDetailsService(authUserService);
38 //auth.inMemoryAuthentication().withUser("user").password("password");
39 }
40 /*@Configuration
41 protected static class AuthenticationConfiguration extends GlobalAuthenticationConfigurerAdapter {
42 @Autowired
43 AuthUserService authUserService;
44
45 @Override
46 public void init(AuthenticationManagerBuilder auth) throws Exception {
47 //auth.inMemoryAuthentication().withUser("user").password("password");
48 auth.userDetailsService(authUserService);
49 }
50 }*/
51 }

一、configur方法 基本配置

No Source Comment
L1 @Configuration 这个就是java形式的bean spring3.0以后 允许以 @Configuration 注解来代替XML形式的bean
L2 @EnableWebSecurity 用这个注解开启 spring security配置验证开启
L3 WebSecurityConfigurerAdapter 这个需要我们继承WebSecurityConfigurerAdapter适配器且重写

configure 函数 来实现访问的控制(那些访问/资源 需要哪些权限)和登录的验证(数据库验证/内存验证)

L6 authorizeRequests() 通过authorizeRequests()配下的子函来完成访问/授权 配置
L7,8 antMatchers/permitAll antMatchers里配置的资源是可以被所有用户访问(permitAll)的
L9 and() 类似于结束标签
L10 formLogin 通过formLogin()配下的函数对登录form进行配置
L11 loginPage 设置登录页面
L12 defaultSuccessUrl 默认登录成功跳转地址
L13 failureUrl 默认登录失败跳转地址
L14,15 usernameParameter
passwordParameter
用户名密码验证用 *这里的参数要和画面上控件名保持一致
L18  logout() 通过logout()配下的函数对注销进行配置
L19 .logoutRequestMatcher(new AntPathRequestMatcher("/logout")) 设置注销用的请求URL
L20 logoutSuccessUrl 设置注销成功后的跳转URL
L21 deleteCookies 消除Cookie
L22 invalidateHttpSession 销毁Session
L25 sessionManagement 通过sessionManagement配下的函数对session配置
L27 maximumSessions 同一用户session上限设定 *比如同一个用户 多次登录
L28 maxSessionsPreventsLogin maximumSessions设定的上限启用 * 超出报错
L29 expiredUrl

超过session上限跳转URL设定

二、globalAuthConfig方法 认证

先说L38 这行注掉的 是内存认证模式  意思是创建了一个 名为user 密码 为password的用户

然后是 L37 这也是认证核心

先看一下这个 传入参数的的构成 也就是 AuthUserService 类

 1 @Service
2 public class AuthUserService implements UserDetailsService{
3
4 @Autowired
5 MstUsersMapper mstUsersMapper;
6
7 @Override
8 public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
9 Users users =mstUsersMapper.selectByPrimaryKey(username);
10 if(users == null) {
11 throw new UsernameNotFoundException("User not found for name:"+username);
12 }
13 return new AuthUser(users);
14 }
15
16 public String getAuthorityByLoginId(String loginId ){
17 //Map<String,String> authKindMap = new HashMap<String,String>();
18 String auth = mstUsersMapper.selectAuthorityByLoginId(loginId);
19 return auth;
20 }
21 }

可以看到我们是 实现了UserDetailsService 然后重写了一个loadUserByUsername和追加了一个 getAuthorityByLoginId函数

关于 getAuthorityByLoginId 好说的基本上就是 当前用户的权限

然后是loadUserByUsername

可以通过名字基本上可以看的出是 通过name 取user 的信息 实际上也是这样 这里并不判断你输的密码对不对 主要是

判断你输入的用户名在数据库里存不存在 不存在 报错 扔出 存在 实例化一个 AuthUser 返回

这个AuthUser 类也很重要 实现了UserDetails  如下

 1 public class AuthUser implements UserDetails {
2 private static final long serialVersionUID = 1L;
3
4 private String userId;
5 private String loginId;
6 private String password;
7 private String authorityKind;
8 public AuthUser(Users users) {
9 super();
10 this.userId = users.getUserId();
11 this.loginId = users.getLoginId();
12 this.password = users.getPassword();
13 this.authorityKind = users.getAuthorityKind();
14 }
15
16 @Override
17 public Collection<GrantedAuthority> getAuthorities() {
18 List<GrantedAuthority> list = new ArrayList<GrantedAuthority>();
19 list.add(new SimpleGrantedAuthority(authorityKind));
20 return list;
21 }
22
23 @Override
24 public String getPassword() {
25 return password;
26 }
27
28 @Override
29 public String getUsername() {
30 return loginId;
31 }
32
33 @Override
34 public boolean isAccountNonExpired() {
35 return true;
36 }
37
38 @Override
39 public boolean isAccountNonLocked() {
40 return true;
41 }
42
43 @Override
44 public boolean isCredentialsNonExpired() {
45 return true;
46 }
47
48 @Override
49 public boolean isEnabled() {
50 return true;
51 }

这里的几个点要注意一下

L17 getAuthorities 它返回了一个权限集合 这个集合是和你在画面侧用的hasAnyAuthority('ROLE_USER','ROLE_ADMIN') 这个函数相呼应的

换言之你之所以能在画面侧如上那样写也是因为你在这里吧把当前用户的权限set进去了

然后看一下我们实现的 UserDetails这个父类,如下官网文档给的信息.

No Modifier and Type Method and Description
1 java.util.Collection<? extends GrantedAuthority> getAuthorities()

Returns the authorities granted to the user.
2 java.lang.String getPassword()

Returns the password used to authenticate the user.
3 java.lang.String getUsername()

Returns the username used to authenticate the user.
4 boolean isAccountNonExpired()

Indicates whether the user's account has expired.
5 boolean isAccountNonLocked()

Indicates whether the user is locked or unlocked.
6 boolean isCredentialsNonExpired()

Indicates whether the user's credentials (password) has expired.
7 boolean isEnabled()

Indicates whether the user is enabled or disabled.

前3个应该不用说了,从第四个开始说一下

isAccountNonExpired():当前账号是否已经过期

isAccountNonLocked():当前账号是否被锁

isCredentialsNonExpired():当前账号证书(密码)是否过期

isEnabled():当前账号是否被禁用

都要给设成true 否则登录会报出来

还有实现一个UserDetailsService类如下

 1 @Service
2 public class AuthUserService implements UserDetailsService{
3
4 @Autowired
5 MstUsersMapper mstUsersMapper;
6
7 @Override
8 public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
9 Users users =mstUsersMapper.selectByPrimaryKey(username);
10 if(users == null) {
11 throw new UsernameNotFoundException("User not found for name:"+username);
12 }
13 return new AuthUser(users);
14 }
15
16 public String getAuthorityByLoginId(String loginId ){
17 //Map<String,String> authKindMap = new HashMap<String,String>();
18 String auth = mstUsersMapper.selectAuthorityByLoginId(loginId);
19 return auth;
20 }
21 }
如你看到那样loadUserByUsername这函数并不做密码验证只是拿username取用户信息,当然取不到报错
取到交给AuthUser,然后spring boot 自己再去判断密码,以及前面说的那个几个check
剩下的就是 Controller这个就没有特别要说的到git上看代码就完了
最后贴一下执行效果图及git地址

(完)

spring boot系列--spring security (基于数据库)登录和权限控制的更多相关文章

  1. spring boot系列03--spring security (基于数据库)登录和权限控制(下)

    (接上篇) 后台 先说一下AuthConfig.java Spring Security的主要配置文件之一 AuthConfig 1 @Configuration 2 @EnableWebSecuri ...

  2. spring boot系列03--spring security (基于数据库)登录和权限控制(上)

    这篇打算写一下登陆权限验证相关 说起来也都是泪,之前涉及权限的比较少所以这次准备起来就比较困难. 踩了好几个大坑,还好最终都一一消化掉(这是废话你没解决你写个什么劲

  3. Spring Boot系列——Spring Boot如何启动

    Spring Boot启动过程 ​上篇<Spring Boot系列--5分钟构建一个应用>介绍了如何快速创建一个Spring Boot项目并运行.虽然步骤少流程简单,为开发者省去了很多重复 ...

  4. Spring Security实现统一登录与权限控制

    1  项目介绍 最开始是一个单体应用,所有功能模块都写在一个项目里,后来觉得项目越来越大,于是决定把一些功能拆分出去,形成一个一个独立的微服务,于是就有个问题了,登录.退出.权限控制这些东西怎么办呢? ...

  5. Spring Boot + Vue + Shiro 实现前后端分离、权限控制

    本文总结自实习中对项目的重构.原先项目采用Springboot+freemarker模版,开发过程中觉得前端逻辑写的实在恶心,后端Controller层还必须返回Freemarker模版的ModelA ...

  6. 国内最全的Spring Boot系列之二

    历史文章 <国内最全的Spring Boot系列之一> 视频&交流平台 SpringBoot视频:http://t.cn/R3QepWG Spring Cloud视频:http:/ ...

  7. 基于Spring Boot和Spring Cloud实现微服务架构学习

    转载自:http://blog.csdn.net/enweitech/article/details/52582918 看了几周Spring相关框架的书籍和官方demo,是时候开始总结下这中间的学习感 ...

  8. 基于Spring Boot和Spring Cloud实现微服务架构学习--转

    原文地址:http://blog.csdn.net/enweitech/article/details/52582918 看了几周spring相关框架的书籍和官方demo,是时候开始总结下这中间的学习 ...

  9. Spring boot 中 Spring Security 使用改造5部曲(转)

    文章的内容有点长,也是自己学习Spring security的一个总结.如果你从头看到尾,我想你对Spring Security的使用和基本原理应该会有一个比较清晰的认识. 如果有什么理解不对的地方, ...

随机推荐

  1. pom.xml出现web.xml is missing and <failOnMissingWebXml> is set to true解决方案

    提示信息应该能看懂.也就是缺少了web.xml文件,<failOnMissingWebXml>被设置成true了. 搜索了一下,Stack Overflow上的答案解决了问题,分享一下. ...

  2. hdu 1002(大数)

    A + B Problem II Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) ...

  3. 【Oracle】创建角色

    任务:创建角色 1)创建角色sse_role,授予create session 权限 2)创建角色tblo_role,授予CREATE PROCEDURE, CREATE SEQUENCE, CREA ...

  4. svn SSL 错误:Key usage violation in certificate has been detected

    CentOS/RHEL yum 安装的 subversion 是 1.6.11 版本,连VisualSVN服务器时会有"Key usage violation"的错误 将subve ...

  5. lambda表达式、匿名函数

    lambda表达式是函数式编程中的匿名函数语法规范. In computer programming, an anonymous function (function literal, lambda ...

  6. Robot Framework(三)创建测试用例

    2.2.1测试用例语法 基本语法 测试用例由关键字在测试用例表中构建.关键字可以从测试库或资源文件导入,也可以在测试用例文件本身的关键字表中创建. 测试用例表中的第一列包含测试用例名称.测试用例从包含 ...

  7. Java并发-J.U.C之AQS

    AQS(Abstract Queue Synchronizer)介绍 [死磕Java并发]—–J.U.C之AQS(一篇就够了) 下面讲解具体的Java并发工具类 1 CountDownLatch 参考 ...

  8. Java中数组的反转

    public class ArrayDemo2 { public static void main(String[] args) { //定义一个数组存放元素 int[] arr3 = {10, 20 ...

  9. 解决phpstudy mysql 启动不了的问题

    1.端口监测 查看3306 的端口是否被占用,如占用,停止进程 2.服务没有启动.因为学习python 我把phpstudy的mysql升级到了mysql8.0. sc delete mysql  删 ...

  10. nginx视频服务缓存方案设置指导

    本文描述了如何通过设置nginx缓存达到降低服务器后端压力的效果以及结合nginx第三方插件ngx_cache_purge实现nginx缓存后的自动清理功能.具体实施步骤如下所示:第一步:获取清除清除 ...