SpringSecurity[5]-基于表达式的访问控制/基于注解的访问控制/Remember Me功能实现

news2024/11/27 18:23:45

上一篇:SpringSecurity[4]-访问控制url匹配/内置访问控制方法介绍/角色权限判断

链接:SpringSecurity[4]-访问控制url匹配/内置访问控制方法介绍/角色权限判断_豆虫儿的博客-CSDN博客

十一、基于表达式的访问控制

1.access()方法使用

之前学习的登录用户权限判断实际上底层实现都是调用access(表达式)

可以通过access()实现和之前学习的权限控制完成相同的功能。

1.1以hasRole和permitAll举例

下面代码和直接使用permitAll()和hasRole()是等效的。

2.使用自定义方法

虽然这里面已经包含了很多的表达式(方法)但是在实际项目中很有可能出现需要自己自定义逻辑的情况。

判断登录用户是否具有访问当前URL权限。

2.1新建接口及实现类

新建接口com.msb.service.MyService后新建实现类。

public interface MyService {
    boolean hasPermission(HttpServletRequest request, Authentication authentication);
}
@Component
public class MyServiceImpl implements MyService {
    @Override
    public boolean hasPermission(HttpServletRequest request, Authentication authentication) {
        Object obj = authentication.getPrincipal();
        if(obj instanceof UserDetails){
            UserDetails user = (UserDetails) obj;
            Collection<? extends GrantedAuthority> authorities = user.getAuthorities();
            return authorities.contains(new SimpleGrantedAuthority(request.getRequestURI()));
        }
        return false;
    }
}

2.2修改配置类

在access中通过@bean的id名.方法(参数)的形式进行调用

配置类中修改如下:

 // url 拦截 (授权)
http.authorizeRequests()
        .antMatchers("/login.html").access("permitAll")
        .antMatchers("/fail.html").permitAll()
        .anyRequest().access("@myServiceImpl.hasPermission(request,authentication)");

十二、基于注解的访问控制

在Spring Security中提供了一些访问控制的注解。这些注解都是默认是都不可用的,需要通过@EnableGlobalMethodSecurity进行开启后使用。

如果设置的条件允许,程序正常执行。如果不允许会报500

这些注解可以写到Service接口或方法上上也可以写到Controller或Controller的方法上。通常情况下都是写在控制器方法上的,控制接口URL是否允许被访问。

1.@Secured

@Secured是专门用于判断是否具有角色的。能写在方法或类上。参数要以ROLE_开头。

1.1实现步骤

1.1.1 开启注解

在启动类(也可以在配置类等能够扫描的类上)上添加@EnableGlobalMethodSecurity(securedEnabled = true)

@SpringBootApplication
@EnableGlobalMethodSecurity(securedEnabled = true)
public class MyApp {
    public static void main(String [] args){
        SpringApplication.run(MyApp.class,args);
    }
}

1.1.2在控制器方法上添加@Secured注解

在LoginController中方法上添加注解

@Secured("abc")
@RequestMapping("/toMain")
public String toMain(){
    return "redirect:/main.html";
}

1.1.3配置类

配置类中方法配置保留最基本的配置即可。

protected void configure(HttpSecurity http) throws Exception {
    // 表单认证
    http.formLogin()
            .loginProcessingUrl("/login")   //当发现/login时认为是登录,需要执行UserDetailsServiceImpl
            .successForwardUrl("/toMain")   //此处是post请求
            .loginPage("/login.html");
​
    // url 拦截
    http.authorizeRequests()
            .antMatchers("/login.html").permitAll() //login.html不需要被认证
            .anyRequest().authenticated();//所有的请求都必须被认证。必须登录后才能访问。
​
    //关闭csrf防护
    http.csrf().disable();
​
}

2.@PreAuthorize/@PostAuthorize

@PreAuthorize和@PostAuthorize都是方法或类级别注解。

@PreAuthorize表示访问方法或类在执行之前先判断权限,大多情况下都是使用这个注解,注解的参数和access()方法参数取值相同,都是权限表达式。

@PostAuthorize表示方法或类执行结束后判断权限,此注解很少被使用到。

2.1实现步骤

2.1.1开启注解

在启动类中开启@PreAuthorize注解。

@SpringBootApplication
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class MyApp {
    public static void main(String [] args){
        SpringApplication.run(MyApp.class,args);
    }
}

2.1.2添加@PreAuthorize

在控制器方法上添加@PreAuthorize,参数可以是任何access()支持的表达式

@PreAuthorize("hasRole('abc')")
@RequestMapping("/toMain")
public String toMain(){
    return "redirect:/main.html";
}

十三、Remember Me功能实现

Spring Security 中Remember Me为“记住我”功能,用户只需要在登录时添加remember-me复选框,取值为true。Spring Security会自动把用户信息存储到数据源中,以后就可以不登录进行访问。

1.添加依赖

Spring Security实现Remember Me 功能时底层实现依赖Spring-JDBC,所以需要导入Spring-JDBC。以后多使用MyBatis框架而很少直接导入spring-jdbc,所以此处导入mybatis启动器

同时还需要添加MySQL驱动

<dependency>
    <groupId>org.mybatis.spring.boot</groupId>
    <artifactId>mybatis-spring-boot-starter</artifactId>
    <version>2.1.1</version>
</dependency>
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>5.1.6</version>
</dependency>

2.配置数据源

在application.properties中配置数据源。请确保数据库中已经存在security数据库

spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/mashibing
spring.datasource.username=root
spring.datasource.password=root

3.编写配置

新建com.msb.config.RememberMeConfig类,并创建Bean对象

@Configuration
public class RememberMeConfig {
    @Autowired
    private DataSource dataSource;
    @Bean
    public PersistentTokenRepository getPersistentTokenRepository() {
        JdbcTokenRepositoryImpl jdbcTokenRepositoryImpl=new JdbcTokenRepositoryImpl();
        jdbcTokenRepositoryImpl.setDataSource(dataSource);
        //自动建表,第一次启动时需要,第二次启动时注释掉
//        jdbcTokenRepositoryImpl.setCreateTableOnStartup(true);
        return jdbcTokenRepositoryImpl;
    }
}

4.修改SecurityConfig

在SecurityConfig中添加RememberMeConfig和UserDetailsService实现类对象,并自动注入。

在configure中添加下面配置内容。

http.rememberMe()
        .userDetailsService(userDetailsService) //登录逻辑交给哪个对象
        .tokenRepository(repository);   //持久层对象

5.在客户端页面中添加复选框

在客户端登录页面中添加remember-me的复选框,只要用户勾选了复选框下次就不需要进行登录了。

<form action = "/login" method="post">
    用户名:<input type="text" name="username"/><br/>
    密码:<input type="text" name="password"/><br/>
    <input type="checkbox" name="remember-me" value="true"/> <br/>
    <input type="submit" value="登录"/>
</form>

6.有效时间

默认情况下重启项目后登录状态失效了。但是可以通过设置状态有效时间,即使项目重新启动下次也可以正常登录。

//remember Me
http.rememberMe()
        .tokenValiditySeconds(120)//单位:秒
        .tokenRepository(repository)
        .userDetailsService(userDetailsServiceImpl);

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/88466.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Spring Security进阶学习

Spring Security整体架构 认证 认证核心组件的大体关系如下&#xff1a; Spring Security 中的认证工作主要由 AuthenticationManager 接口来负责&#xff0c;它处理来自框架其他部分的身份验证请求。其中还涉及到一些关键类&#xff0c;比如&#xff1a;AuthenticationProvi…

同城预约小程序上门服务上门理疗推拿按摩系统养生美容行业程序源码

在这个工作生活压力巨大的社会&#xff0c;大家恨不得一分钟掰成两半过&#xff0c;别提什么休闲娱乐了&#xff0c;能睡个饱觉就已经是奢侈了&#xff01;工作固然重要&#xff0c;身心的放松也需要重视&#xff0c;好在随着互联网&#xff0b;的发展&#xff0c;越来越多的行…

PMO在企业项目管理中的五个重要作用

PMO项目管理办公室是成功企业的关键管理工具。它对于推动项目的发展至关重要&#xff0c;以下是PMO的五个重要作用&#xff1a; 1、项目管理过程的标准化 PMO的主要目标在于方法、流程和工具的创建和标准化。 PMO 可能创建的模板包括&#xff1a; • 项目建议书模板。这有…

Java Optional 实用判空实用实战,优雅永不过时

平时我们很多实体类里面会嵌套实体类&#xff0c;实体里面还嵌套实体。 那么我们有时为了取出最里面的实体的某个值的时候&#xff0c;我们就不得不一层层剥开这个 让人流泪的洋葱&#xff0c; 一层层判断。 举例&#xff08;随便举的&#xff09;&#xff1a; 就像这么一个…

关于迭代器遍历及auto关键词

在使用vector容器或者字符串时&#xff0c;很经常会用到一些遍历操作&#xff0c;除了使用下标遍历之外&#xff0c;使用迭代器遍历也是超级方便&#xff0c;但是迭代器也有有一些小坑&#xff0c;一不注意就会编译出错&#xff0c;所以特意总结一下。 迭代器 迭代器很很多接口…

性能测试之nginx监控系统搭建

不同tomcat服务器的负载均衡 在Nginx服务器192.168.43.138上安装Nginx&#xff0c;&#xff08;安装教程在前几篇文章有详细描述 &#xff09;实现反向代理tomcat负载均衡 执行一下命令&#xff0c;关闭防火墙 systemctl disable firewalld.service systemctl stop firewall…

[附源码]Node.js计算机毕业设计防疫科普微课堂Express

项目运行 环境配置&#xff1a; Node.js最新版 Vscode Mysql5.7 HBuilderXNavicat11Vue。 项目技术&#xff1a; Express框架 Node.js Vue 等等组成&#xff0c;B/S模式 Vscode管理前后端分离等等。 环境需要 1.运行环境&#xff1a;最好是Nodejs最新版&#xff0c;我…

从外包被裁到拿到阿里Offer,多亏P8架构师的全套面试文档

引言 又是一年跳槽季&#xff0c;在疫情的影响下&#xff0c;今年的金三银四冷清不少。但无论如何&#xff0c;2020年招聘市场已经显示出了一个清晰的趋势&#xff0c;java开发岗面试越来越难&#xff0c;需求越来越少&#xff01;也更增加了游戏的“难度系数”。 跳槽时时刻刻…

99-数据结构与算法(上篇)

数据结构与算法数据结构和算法&#xff0c;一个非常古老的课题&#xff0c;工作的时候&#xff0c;一般只求程序能跑&#xff0c;并不太关注性能 一般情况下&#xff0c;我们尽量避坑&#xff0c;即避免这样&#xff1a;ArrayList Or LinkedList&#xff0c;哪个简单用哪个 实…

【Kubernetes】一主二从环境搭建,详细的图文描述

kubernetes&#xff0c;是一个全新的基于容器技术的分布式架构领先方案&#xff0c;是谷歌严格保密十几年的秘密武器----Borg系统的一个开源版本&#xff0c;于2014年9月发布第一个版本&#xff0c;2015年7月发布第一个正式版本。 kubernetes的本质是一组服务器集群&#xff0…

使用Java API操作HDFS

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录学习目标&#xff08;一&#xff09;了解HDFS Java API1、HDFS常见类与接口2、FileSystem的常用方法&#xff08;二&#xff09;编写Java程序访问HDFS1、创建Maven项…

Nacos 配置中心之长轮询--服务端

先回顾一下客户端和服务端交互的过程 服务端 入口 直接看长轮询的接口 ConfigController.listener PostMapping("/listener")Secured(action ActionTypes.READ, parser ConfigResourceParser.class)public void listener(HttpServletRequest request, HttpServ…

抓住三个关键因素,提高你的ASA广告效果!

​ 众所周知&#xff0c;App Store 作为 iOS 端的流量收口&#xff0c;旗下的 ASA 广告更是广告主在 iOS 生态投放广告的唯一渠道&#xff0c;所提供的四大广告位&#xff08;Today 标签、搜索标签、搜索结果和产品页面&#xff09;覆盖了用户访问的全路径&#xff0c;为广告主…

12月14日:跟着猫叔写代码api中的增删改查

首先在数据库中建立一个学生成绩信息表 DROP TABLE IF EXISTS bro_ceshiapi; CREATE TABLE bro_ceshiapi (id int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT id,name varchar(100) DEFAULT NULL COMMENT 姓名,class varchar(100) DEFAULT NULL COMMENT 班级,score decima…

[附源码]Python计算机毕业设计Django基于vuejs的文创产品销售平台app

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;…

学习Vue3 - 认识 Reactive 全家桶

reactive 用来绑定复杂的数据类型&#xff0c;例如&#xff1a;对象、数组 reactive 源码约束了我们的类型 他是不可以绑定普通的数据类型的&#xff0c;这样是不允许的&#xff0c;会报错 因此&#xff0c;如果绑定普通的数据类型&#xff0c;可以使用ref ref绑定对象或者…

计算机SCI论文,如何写吸引人的摘要? - 易智编译EaseEditing

摘要简明扼要的概括全文的主要内容&#xff0c;是整篇文章的精华&#xff0c;是编辑、审稿专家以及读者阅读文章的最先关注的部分。 一个好的摘要可以正确反映文章内容&#xff0c;引起编辑、审稿专家以及读者的关注。那如何写出一个好的论文摘要呢&#xff0c;今天小易为大家…

一种基于摩斯密码的页面加密方法(web和小程序)

1. 开始 web开发中&#xff0c;常有一些功能仅希望对开发、测试人员等一小部分人展示&#xff0c;比如测试一个小程序项目中&#xff0c;想让测试人员快速复制当前对应的h5页面&#xff0c;这时候如果页面是必须登录的&#xff0c;我们可以借助vconsole&#xff0c;然后维护一…

redis之主从切换可能有哪些问题

写在前面 本文一起看下Redis cluster 集群模式下&#xff0c;发生了主从切换时可能存在的问题以及应对方案。 1&#xff1a;主从数据不一致 主从数据不一致&#xff0c;是由于主从同步延迟造成的&#xff0c;可能的解决方案如下&#xff1a; 1&#xff1a;尽量将主从同机房…

React面试:谈谈虚拟DOM,Diff算法与Key机制

1.虚拟dom 原生的JS DOM操作非常消耗性能&#xff0c;而React把真实原生JS DOM转换成了JavaScript对象。这就是虚拟Dom&#xff08;Virtual Dom&#xff09; 每次数据更新后&#xff0c;重新计算虚拟Dom&#xff0c;并和上一次生成的虚拟dom进行对比&#xff0c;对发生变化的…