IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> Spring框架Security(认证)快速上手 -> 正文阅读

[Java知识库]Spring框架Security(认证)快速上手

在处理Spring安全框架时,通常可以选择Shiro或者Security,做认证授权加密等。
推荐非SpringBoot,使用Shiro,SpringBoot项目使用Security
学习网址:
Security
Shiro

1.SpringBoot快速装配Security

基础步骤:

  • 引入依赖
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-security</artifactId>
        </dependency>

重启SpringBoot项目,访问网页,这里使用后台提供的账号密码登录
在这里插入图片描述

  • 实现UserDetailsService
    这里开始账号,密码,角色认证(对应User中参数)
@Service
public class DetailService implements UserDetailsService {

    @Autowired
    private PasswordEncoder pe;

    @Override
    public UserDetails loadUserByUsername(String s) throws UsernameNotFoundException {
        return new User("xiaoming",pe.encode("666"),new ArrayList<>());
    }
}
  • 选择加密器
    这里使用PasswordEncoder做密码加密
  • 把加密器交给Spring管理 (设置配置文件@Bean)

这里使用加密算法BCryptPasswordEncoder
其他加密算法:
BCryptPasswordEncoder
Argon2PasswordEncoder
Pbkdf2PasswordEncoder
SCryptPasswordEncoder(单向加密)
加密器详细


@Configuration
public class SecurityConfig {

    @Bean
    public PasswordEncoder getPasswordEncoder(){
        return new BCryptPasswordEncoder();
    }
}

密码必须加密,否则提示Encoded password does not look like BCrypt

2.认证结合数据库使用

只需4步

  1. 编写数据库
    必须包含账号密码角色
  2. 整合Mybatis
  3. 编写Entity实体类以及Dao类
    注意:由于UserDetailsService返回类型为UserDetails,因此创建的实体类需要实现UserDetails接口
    实现UserDetails类重写以下方法。
	private Integer id;
    private String username;
    private String password;
    private String realName;
    private Boolean enabled;
    private Boolean locked;
    private Boolean expired;
    private Boolean credentialsExpired;
    private Date createTime;
    private Date loginTime;
//账号是否过期,0-已过期,1-未过期
    @Override
    public boolean isAccountNonExpired() {
        return this.expired;
    }
    //账号是否被锁定,0-锁定,1-未锁定
    @Override
    public boolean isAccountNonLocked() {
        return this.locked;
    }
    //账号凭证是否过期,0-已过期,1-未过期
    @Override
    public boolean isCredentialsNonExpired() {
        return this.credentialsExpired;
    }
    //账号是否有效,0-失效,1-有效
    @Override
    public boolean isEnabled() {
        return this.enabled;
    }
    //Collection<GrantedAuthority>  authorities,这个属性中存储了这个用户所有的权限
    //暂未使用,后面授权补充
    @Override
    public Collection<? extends GrantedAuthority> getAuthorities() {
        return null;
    }

重写的方法可以用做封号处理等
4. 修改UserDetailsService
直接找数据库要信息就可以了


@Service
public class DetailService implements UserDetailsService {

    @Autowired
    private PasswordEncoder pe;

    @Autowired
    private SysUserDao sysUserDao;

    @Override
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
        SysUser sysUser = sysUserDao.selectByUsername(username);
        return sysUser;
    }
}

注意数据库中密码也必须是PasswordEncoder (使用同样的加密方式)加密过的

前面Security默认将所有URL拦截掉,需要登录认证才能访问URL下面我们把将公开的URL开放供所有人访问

3.给公共URL放行

1.首先开启Spring Security Web安全配置

  • 在SecurityConfig中添加注解@EnableWebSecurity
  • SecurityConfig类继承WebSecurityConfigurerAdapter
  1. 控制Spring Security是否使用调试模式(通过注解属性debug指定),缺省为false,表示缺省不使用调试模式;
  2. 导入 WebSecurityConfiguration,用于配置Web安全过滤器FilterChainProxy;
  3. 如果是Servlet 环境,导入WebMvcSecurityConfiguration;
  4. 如果是OAuth2环境,导入OAuth2ClientConfiguration;
  5. 使用注解@EnableGlobalAuthentication启用全局认证机制;

2.编辑资源拦截配置与开放URL权限
在这里插入图片描述

重写

configure(HttpSecurity http)

先观察原本的configure(HttpSecurity http) 方法如下。
在这里插入图片描述
重写放权

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests()
                .antMatchers("/hello").permitAll()//所有人可以访问
                .anyRequest().authenticated();//配置所有路径只有登录才可以访问

        http.formLogin();//开启表单登录
        http.httpBasic();
    }

到这里已经成功放行了
下面简单记录一下几种主要配置

URL匹配常用的几种方式

  1. requestMatchers() 配置一个request Mather数组,参数为RequestMatcher 对象,其match 规则自定义,需要的时候放在最前面,对需要匹配的的规则进行自定义与过滤
  2. antMatchers() 配置一个request Mather 的 string数组,参数为 ant 路径格式, 直接匹配url
  3. anyRequest 匹配任意url,无参,必须放在最后面

URL权限
permitAll() 已登录和未登录用户都能访问
authenticated() 已登录用户能访问,未登录用户不能访问
anonymous() 未登录用户能访问,已登录用户不能访问
denyAll() 已登录和未登录用户都不能访问
rememberMe() 通过“记住我”功能直接登录的用户可以访问
fullyAuthenticated() 不是通过“记住我”功能直接登录的用户可以访问

登录login配置
1.formLogin() 配置基于表单登录的认证方式
loginPage() 登录页地址,默认“/login”
loginProcessingUrl 提交表单之后真正处理登录请求的地址
defaultSuccessUrl 默认跳转到 Referer 来源页面,如果 Referer 为空,没有来源页,则跳转到默认设置的页面
successForwardUrl 登录后一律跳转到指定的地址
failuerUrl登录失败之后系统转向的url,默认是loginPage + “?error”
failuerHandler登录失败之后的处理器
successHandler登录成功之后的处理器
2.httpBasic() 配置Http Basic认证方式
了解httpBasic

登出logout配置
logout() 配置登出
logoutUrl 登出url,默认是/logout
logoutSuccessUrl 登出成功后跳转的 url 默认是"/login?logout"
logoutSuccessHandler 登出成功处理器,设置后会把logoutSuccessUrl 置为null

4.自定义登录界面

  • 添加自己的登录界面
    注意两个地方
    在这里插入图片描述
  • 放开权限
  • 按照上面登录login配置来配置跳转跟传参地址
    在这里插入图片描述
  • 关闭csrf或者在登录表单增加csrf字段
    注意:

如果这里运行访问http://localhost:8080/myLogin.html后台不报错,但是网页报
*This application has no explicit mapping for /error, so you are seeing this as a fallback. Mon May 09 17:03:35 CST 2022 There was an unexpected error (type=Not Found, status=404). No message available*
不必惊慌,有可能原因是:

  1. 你的Application运行类位置放错了,所有包的外面就可以了
    在这里插入图片描述
  2. 可能是你的Maven没有配置或者出现了问题,重新修改个Maven配置就可以了。

5. Remember me

这个功能主要是做网页登录记住我选项达到未来一段时间不用登录的效果。
以下代码都添加在SecurityConfig配置类中。

  1. Spring Security提供了一个JdbcTokenRepositoryImpl类来帮助简化Remember Me功能的开发,创建这个类并放到Spring容器中,JdbcTokenRepositoryImpl需要数据源,通过注入的方式提供。
@Autowired
private DataSource dataSource;  //数据库连接池

@Bean
public PersistentTokenRepository persistentTokenRepositoryBean(){
    JdbcTokenRepositoryImpl jdbcTokenRepository = new JdbcTokenRepositoryImpl();
    //指定数据源
    jdbcTokenRepository.setDataSource(dataSource);
    //启动时创建表,第一次启动时使用,后面要注释掉
    jdbcTokenRepository.setCreateTableOnStartup(true);
    return jdbcTokenRepository;
}

如果我们运行第二次 而jdbcTokenRepository.setCreateTableOnStartup(true);没有注释那么后台报
Error creating bean with name ‘springSecurityFilterChain’ defined in class path resource …nested exception is com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Table ‘persistent_logins’ already exists,意思是这个存放记住我的相关表已经创建过了。

  1. 使用Remember-Me自动登录时,也需要查询用户的信息,需要指定UserDetailsService。
@Autowired
private UserDetailsService userDetailsService;

@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
    auth.userDetailsService(userDetailsService); 
}
  1. 配置token的持久化方式及有效时长
http.rememberMe().tokenRepository(persistentTokenRepositoryBean()).tokenValiditySeconds(10*24*60*60);
  1. 登录页面增加remember-me字段

在这里插入图片描述

到这里Spring Security认证部分已经基本上是完了。

提一句一般用JWT替换httpBasic,只需要Spring Security整合JWT就可以了。

  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2022-05-11 16:17:11  更:2022-05-11 16:20:59 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 23:22:46-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码