说明 springboot 版本 2.0.3
源码地址:点击跳转

一、 介绍

  Spring Security 是一个能够为基于 Spring 的企业应用系统提供声明式的安全访问控制解决方案的安全框架。它提供了一组可以在 Spring 应用上下文中配置的 Bean,充分利用了 Spring IoC,DI(控制反转 Inversion of Control ,DI:Dependency Injection 依赖注入)和 AOP(面向切面编程)功能,为应用系统提供声明式的安全访问控制功能,减少了为企业系统安全控制编写大量重复代码的工作。

二、 环境搭建

  建立 springboot2 项目,加入 security 依赖,mybatis 依赖

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-security</artifactId>
</dependency>
<dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>1.3.2</version>
</dependency>
<dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><scope>runtime</scope>
</dependency>
复制代码

数据库为传统的用户--角色--权限,权限表记录了 url 和 method,springboot 配置文件如下:

mybatis:
  type-aliases-package: com.example.demo.entity
server:
  port: 8081
spring:
  datasource:
    driver-class-name: com.mysql.jdbc.Driver
    url: jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf-8&useSSL=true
    username: root
    password: 123456
  http:
    encoding:
      charset: utf-8
      enabled: true
复制代码

springboot 启动类中加入如下代码,设置路由匹配规则。

@Override
protected void configurePathMatch(PathMatchConfigurer configurer) {configurer.setUseSuffixPatternMatch(false) //设置路由是否后缀匹配,譬如/user能够匹配/user.,/user.aa.setUseTrailingSlashMatch(false); //设置是否后缀路径匹配,比如/user能够匹配/user,/user/
}
复制代码

三、 security 配置

  默认情况下 security 是无需任何自定义配置就可使用的,我们不考虑这种方式,直接讲如何个性化登录过程。

1、 建立 security 配置文件,目前配置文件中还没有任何配置。

@Configuration
public class SecurityConfig extends WebSecurityConfigurerAdapter {
}
复制代码

2、 个性化登录,security 中的登录如下:

  • security 需要一个 user 的实体类实现UserDetails接口,该实体类最后与系统中用户的实体类分开,代码如下:
public class SecurityUser implements UserDetails{private static final long serialVersionUID = 1L;private String password;private String name;List<GrantedAuthority> authorities;public SecurityUser(string name,string password) {this.id = id;this.password = password;this.name = name;this.age = age;}public void setAuthorities(List<GrantedAuthority> authorities) {this.authorities = authorities;}@Overridepublic Collection<GrantedAuthority> getAuthorities() {return this.authorities;}@Override //获取校验用户名public String getUsername() {return String.valueOf(this.id);}@Override //获取校验用密码public String getPassword() {return password;}@Override //账户是否未过期public boolean isAccountNonExpired() {// TODO Auto-generated method stubreturn true;}@Override  //账户是否未锁定public boolean isAccountNonLocked() {// TODO Auto-generated method stubreturn true;}@Override  //帐户密码是否未过期,一般有的密码要求性高的系统会使用到,比较每隔一段时间就要求用户重置密码public boolean isCredentialsNonExpired() {// TODO Auto-generated method stubreturn true;}@Override //账户是否可用public boolean isEnabled() {// TODO Auto-generated method stubreturn true;}
}
复制代码
  • 编写了实体类还需要编写一个服务类 SecurityService 实现UserDetailsService接口,重写 loadByUsername 方法,通过这个方法根据用户名获取用户信息,代码如下:
@Component
public class SecurityUserService implements UserDetailsService {@Autowiredprivate JurisdictionMapper jurisdictionMapper;@Autowiredprivate UserMapper userMapper;private Logger log = LoggerFactory.getLogger(this.getClass());@Overridepublic UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {log.info("登录用户id为:{}",username);int id = Integer.valueOf(username);User user = userMapper.getById(id);if(user==null) {//抛出错误,用户不存在throw new UsernameNotFoundException("用户名 "+username+"不存在");}//获取用户权限List<GrantedAuthority> authorities = new ArrayList<>();List<Jurisdiction> jurisdictions = jurisdictionMapper.selectByUserId(id);for(Jurisdiction item : jurisdictions) {GrantedAuthority authority = new MyGrantedAuthority(item.getMethod(),item.getUrl());authorities.add(authority);}SecurityUser securityUser = new SecurityUser(user.getName(),user.getPassword(),authority):user.setAuthorities(authorities);return securityUser;}
}
复制代码
  • 通常我们会对密码进行加密,所有还要编写一个 passwordencode 类,实现 PasswordEncoder 接口,代码如下:
@Component
public class MyPasswordEncoder implements PasswordEncoder {private Logger log = LoggerFactory.getLogger(this.getClass());@Override //不清楚除了在下面方法用到还有什么用处public String encode(CharSequence rawPassword) {return StringUtil.StringToMD5(rawPassword.toString());}//判断密码是否匹配@Overridepublic boolean matches(CharSequence rawPassword, String encodedPassword) {return encodedPassword.equals(this.encode(rawPassword));}
}
复制代码

3、 编辑配置文件

  • 编写 config Bean 以使用上面定义的验证逻辑,securityUserService、myPasswordEncoder 通过@Autowired 引入。
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {auth.userDetailsService(securityUserService).passwordEncoder(myPasswordEncoder);
}
复制代码
  • 然后编写 configure Bean(和上一个不一样,参数不同),实现 security 验证逻辑,代码如下:
@Overrideprotected void configure(HttpSecurity http) throws Exception {http.csrf() //跨站.disable() //关闭跨站检测.authorizeRequests()//验证策略策略链.antMatchers("/public/**").permitAll()//无需验证路径.antMatchers("/login").permitAll()//放行登录.antMatchers(HttpMethod.GET, "/user").hasAuthority("getAllUser")//拥有权限才可访问.antMatchers(HttpMethod.GET, "/user").hasAnyAuthority("1","2")//拥有任一权限即可访问//角色类似,hasRole(),hasAnyRole().anyRequest().authenticated().and().formLogin().loginPage("/public/unlogin") //未登录跳转页面,设置了authenticationentrypoint后无需设置未登录跳转页面.loginProcessingUrl("/public/login")//处理登录post请求接口,无需自己实现.successForwardUrl("/success")//登录成功转发接口.failureForwardUrl("/failed")//登录失败转发接口.usernameParameter("id") //修改用户名的表单name,默认为username.passwordParameter("password")//修改密码的表单name,默认为password.and().logout()//自定义登出.logoutUrl("/public/logout") //自定义登出api,无需自己实现.logoutSuccessUrl("public/logoutSuccess")}
复制代码

到这里便可实现 security 与 springboot 的基本整合。

四、实现记住我功能

1、 建表

  记住我功能需要数据库配合实现,首先要在数据库建一张表用户保存 cookie 和用户名,数据库建表语句如下:不能做修改

CREATE TABLE `persistent_logins` (`username` varchar(64) NOT NULL,`series` varchar(64) NOT NULL,`token` varchar(64) NOT NULL,`last_used` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,PRIMARY KEY (`series`)
)
复制代码

2、 编写 rememberMeservice Bean

  代码如下:

    @Beanpublic RememberMeServices rememberMeServices(){JdbcTokenRepositoryImpl jdbcTokenRepository = new JdbcTokenRepositoryImpl();jdbcTokenRepository.setDataSource(dataSource);PersistentTokenBasedRememberMeServices rememberMeServices =new PersistentTokenBasedRememberMeServices("INTERNAL_SECRET_KEY",securityUserService,jdbcTokenRepository);//还可设置许多其他属性rememberMeServices.setCookieName("kkkkk"); //客户端cookie名return rememberMeServices;}
复制代码

dataSource 为@Autowired 引入

3、 配置文件设置 remember

  在 config(HttpSecurity http)中加入记住我功能

.rememberMe().rememberMeServices(rememberMeServices()).key("INTERNAL_SECRET_KEY")
复制代码

在登录表单中设置 remember-me 即可实现记住我功能。

本文原创发布于:www.tapme.top/blog/detail…

spring-boot使用spring-security进行身份认证(1)相关推荐

  1. 认证与授权流程与spring boot整合 spring security(1)

    一   spring security 1.1 spring security的作用 Spring Security所解决的问题就是安全访问控制,而安全访问控制功能其实就是对所有进入系统的请求进行拦截 ...

  2. 玩转Spring Cloud Security OAuth2身份认证扩展——电话号码+验证码认证

    在程序的认证过程中,除了常规的用户名和密码方式(可以参考深入理解Spring Cloud Security OAuth2身份认证),也经常会出现电话号码+密码的方式:电话号码+验证码的方式:或者第三方 ...

  3. 在15分钟内使用Spring Boot和Spring Security构建一个Web应用程序

    "我喜欢编写身份验证和授权代码." 〜从来没有Java开发人员. 厌倦了一次又一次地建立相同的登录屏幕? 尝试使用Okta API进行托管身份验证,授权和多因素身份验证. 开发人员 ...

  4. chrome charset使用_使用JWT保护你的Spring Boot应用 Spring Security实战

    关键词 Spring Boot.OAuth 2.0.JWT.Spring Security.SSO.UAA 写在前面 最近安静下来,重新学习一些东西,最近一年几乎没写过代码.整天疲于奔命的日子终于结束 ...

  5. 使用JWT保护你的Spring Boot应用 - Spring Security实战

    使用JWT保护你的Spring Boot应用 - Spring Security实战 作者 freewolf 原创文章转载请标明出处 关键词 Spring Boot.OAuth 2.0.JWT.Spr ...

  6. spring boot整合spring security笔记

    最近自己做了一个小项目,正在进行springboot和spring Security的整合,有一丢丢的感悟,在这里分享一下: 首先,spring boot整合spring security最好是使用T ...

  7. 一个具有Spring Boot,Spring Security和Stormpath的简单Web应用程序-15分钟

    建筑物身份管理,包括身份验证和授权? 尝试Stormpath! 我们的REST API和强大的Java SDK支持可以消除您的安全风险,并且可以在几分钟内实现. 注册 ,再也不会建立auth了! 更新 ...

  8. Spring boot 整合Spring Security Jwt

    记录学习Spring boot 整合Spring Security Jwt 学习参考 – 慢慢的干货 https://shimo.im/docs/OnZDwoxFFL8bnP1c/read 首先创建S ...

  9. Angular 6集成Spring Boot 2,Spring Security,JWT和CORS

    主要内容:Spring Boot 2的基础应用.CORS配置.Actuator监控:Spring Boot集成springfox-swagger,利用Swagger生成JSON API文档,利用Swa ...

  10. 带有Spring Boot和Spring Cloud的Java微服务

    朋友不允许朋友写用户身份验证. 厌倦了管理自己的用户? 立即尝试Okta的API和Java SDK. 在几分钟之内即可对任何应用程序中的用户进行身份验证,管理和保护. Java是开发微服务架构时使用的 ...

最新文章

  1. leetcode-232 用栈实现队列
  2. pytorch 加载不对齐预训练
  3. 访问ASP.NET临时文件夹的权限问题
  4. 【CyberSecurityLearning 20】xu ni zhuan yong wang luo
  5. java accessablity_java连接access数据库----简单demo
  6. java坐标移动题目case_坐标移动
  7. 小尼机器人_小尼被机器人嫌弃“唱歌难听,长相一般”?
  8. python 实现 CRC 冗余码的方法
  9. 全网最全的Numpy开发入门教程(详细案例版)
  10. 初学者python笔记(函数)
  11. python比较两个文件内容是否一样_python判断两个json文件是否相等
  12. 密码学系列 - 双线性对
  13. python生成3d人体模型_make human开源3D人体建模软件免费下载|make human开源3D人体建模软件2018最新版下载_v1.0.2_9号软件下载...
  14. E430 加装固态硬盘(SSD)参考
  15. 12月25日科技资讯|华为辟谣将发布石墨烯电池手机;梁建章回应携程杀熟;GitLab 12.6 发布
  16. numpy多维数组shape的理解
  17. 用vue写一个npm包(package),发布及引用
  18. TPO Official 53 Independent Writing Task
  19. 64: 创建集群 、 管理集群 、 总结和答疑
  20. BigBrother的大数据之旅Day 17 redis(2)

热门文章

  1. bootstrap导航条文字颜色_XEditor基础组件:导航条
  2. 激活层是每一层都有吗_89小户型复式这样装,每一层都设计得很棒,完工后秒变小区样板间,邻居前来取经...
  3. 网络4/7层模型各层作用和协议对比
  4. 基于vue2.0以及better-scroll实现scroll滑动组件及所实现组件的应用例子
  5. 图像的全局特征--用于目标检测
  6. 详细分析图像形态学操作
  7. 华三实现vlan通过
  8. 机器学习-有监督-SVM
  9. csc.exe已退出,代码为-532462766
  10. C#核编之系统数据类型和相应的C#关键字