iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > JAVA >SpringSecurity权限控制
  • 805
分享到

SpringSecurity权限控制

springjava后端 2023-09-05 12:09:10 805人浏览 薄情痞子
摘要

目录 1、Spring Security简介 2、Spring Security实现权限 2.1、Spring Security入门 2.1.1、修改pom文件 2.1.2、添加配置类 2.2、用户认证 2.2.1、自定义组件 2.2.2、

目录

1、Spring Security简介

2、Spring Security实现权限

2.1、Spring Security入门

2.1.1、修改pom文件

2.1.2、添加配置类

2.2、用户认证

2.2.1、自定义组件

2.2.2、核心组件

2.2.3、在配置类配置相关认证类

2.2.4、执行流程

2.3、用户权限

2.3.1、修改UserDetailsService实现类

2.3.2、修改登录过滤器

2.3.3、修改token解析器

2.3.4、修改SpringSecurity配置类

2.3.5、给Controller方法加上权限注解

2.4、自定义权限异常


1、Spring Security简介

spring 是非常流行和成功的 Java 应用开发框架,Spring Security 正是 Spring 家族中的成员。Spring Security 基于 Spring 框架,提供了一套 WEB 应用安全性的完整解决方案。

正如你可能知道的关于安全方面的两个核心功能是“认证”和“授权”,一般来说,Web 应用的安全性包括用户认证(Authentication)和用户授权(Authorization)两个部分,这两点也是 SpringSecurity 重要核心功能。

(1)用户认证指的是:验证某个用户是否为系统中的合法主体,也就是说用户能否访问该系统。用户认证一般要求用户提供用户名和密码,系统通过校验用户名和密码来完成认证过程。

通俗点说就是系统认为用户是否能登录

(2)用户授权指的是验证某个用户是否有权限执行某个操作。在一个系统中,不同用户所具有的权限是不同的。比如对一个文件来说,有的用户只能进行读取,而有的用户可以进行修改。一般来说,系统会为不同的用户分配不同的角色,而每个角色则对应一系列的权限。

通俗点讲就是系统判断用户是否有权限去做某些事情。

2、Spring Security实现权限

要对Web资源进行保护,最好的办法莫过于Filter。要想对方法调用进行保护,最好的办法莫过于aop(面向切面)。而Spring Security进行认证和鉴权的时候,就是利用的一系列的Filter来进行拦截的。

下面是Spring Security过滤器链:

如图所示,一个请求想要访问到api就会从左到右经过蓝线框里的过滤器,其中绿色部分是负责认证的过滤器,蓝色部分是负责异常处理,橙色部分则是负责授权。进过一系列拦截最终访问到我们的API。

这里面我们只需要重点关注两个过滤器即可:

UsernamePassWordAuthenticationFilter负责登录认证,

FilterSecurityInterceptor负责权限授权。

说明:Spring Security的核心逻辑全在这一套过滤器中,过滤器里会调用各种组件完成功能,掌握了这些过滤器和组件你就掌握了Spring Security!这个框架的使用方式就是对这些过滤器和组件进行扩展。

2.1、Spring Security入门

2.1.1、修改pom文件

           org.springframework.boot       spring-boot-starter-security       2.3.6.RELEASE    

说明:依赖包(spring-boot-starter-security)导入后,Spring Security就默认提供了许多功能将整个应用给保护了起来:

  • 要求经过身份验证的用户才能与应用程序进行交互
  • 创建好了默认登录表单
  • 生成用户名为user的随机密码并打印在控制台上
  • 等等......

2.1.2、添加配置类

@Configuration@EnableWebSecurity //@EnableWebSecurity是开启SpringSecurity的默认行为public class WebSecurityConfig extends WebSecurityConfigurerAdapter {}

随便访问一个我们写好的接口!!

(出现的页面为spring security的默认验证页面),登录的用户名默认为user,密码在项目启动时会在控制台打印,注意每次启动的时候密码都回发生变化!

输入用户名,密码,成功访问到controller方法并返回数据,说明Spring Security默认安全保护生效。

在实际开发中,这些默认的配置是不能满足我们需要的,我们需要扩展Spring Security组件,完成自定义配置,实现我们的项目需求。

2.2、用户认证

用户认证的流程:

以上大部分步骤,spring-security已经给我们完成了,下面是需要我们做的部分:

  • 此处做的登录验证为前后端分离通过请求头是否携带token进行认证

2.2.1、自定义组件

拓展security用户名密码封装对象User

public class CustomUser extends User {        private SysUser sysUser;    public CustomUser(SysUser sysUser, Collection authorities) {        super(sysUser.getUsername(), sysUser.getPassword(), authorities);        this.sysUser = sysUser;    }    public SysUser getSysUser() {        return sysUser;    }    public void setSysUser(SysUser sysUser) {        this.sysUser = sysUser;    }}

重写通过用户名获取用户信息的方法(userDetailsService中的loadUserByUsername)

这里是通过用户名进行数据库查询

@Servicepublic class UserDetailsServiceImpl implements UserDetailsService {    @Autowired    private SysUserService sysUserService;    @Override    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {        SysUser sysUser= sysUserService.getByUserName(username);        if(sysUser==null){            throw new UsernameNotFoundException("该用户名不存在");        }        if(sysUser.getStatus().longValue()==0){            throw new RuntimeException("账号已停用!");        }        return new CustomUser(sysUser, Collections.emptyList());    }}

重写密码校验规则

这里使用md5加密

@Componentpublic class CustomMd5PasswordEncoder implements PasswordEncoder {        public String encode(CharSequence rawPassword) {        return DigestUtils.md5DigestAsHex(rawPassword.toString().getBytes());    }        public boolean matches(CharSequence rawPassword, String encodedPassword) {        return encodedPassword.equals(DigestUtils.md5DigestAsHex(rawPassword.toString().getBytes()));    }}

2.2.2、核心组件

编写登录过滤器

继承UsernamePasswordAuthenticationFilter,对用户名密码进行拦截登录校验

public class TokenLoginFilter extends UsernamePasswordAuthenticationFilter {        public TokenLoginFilter(AuthenticationManager authenticationManager) {        this.setAuthenticationManager(authenticationManager);//设置校验者        this.setPostOnly(false);        //指定登录接口及提交方式,可以指定任意路径        this.setRequiresAuthenticationRequestMatcher(new AntPathRequestMatcher("/admin/system/index/login","POST"));    }        @Override    public Authentication attemptAuthentication(httpservletRequest req, HttpServletResponse res)            throws AuthenticationException {        try {            //通过流的方式将请求的对象封装为指定对象            LoginVo loginVo = new ObjectMapper().readValue(req.getInputStream(), LoginVo.class);            //将指定对象的用户名和密码封装为Authentication对象            Authentication authenticationToken = new UsernamePasswordAuthenticationToken(loginVo.getUsername(), loginVo.getPassword());            //调用authenticate方法完成验证            Authentication authenticate = this.getAuthenticationManager().authenticate(authenticationToken);            return authenticate;        } catch (IOException e) {            throw new RuntimeException(e);        }    }        @Override    protected void successfulAuthentication(HttpServletRequest request, HttpServletResponse response, FilterChain chain,                Authentication auth) throws IOException, ServletException {        //获取验证成功的对象        CustomUser customUser = (CustomUser) auth.getPrincipal();        //生成token        String token = JwtHelper.createToken(customUser.getSysUser().getId(), customUser.getSysUser().getUsername());        //以原生的方式返回token        Map map = new HashMap<>();        map.put("token", token);        ResponseUtil.out(response, Result.success(map));    }        @Override    protected void unsuccessfulAuthentication(HttpServletRequest request, HttpServletResponse response,                  AuthenticationException e) throws IOException, ServletException {        if(e.getCause() instanceof RuntimeException) {            ResponseUtil.out(response, Result.build(null, 204, e.getMessage()));        } else {            ResponseUtil.out(response, Result.build(null, ResultCodeEnum.LOGIN_MOBLE_ERROR));        }    }}

编写token解析器(将认证成功对象传至上下文中)

并且将authentication对象保存至SecurityContext上下文中

public class TokenAuthenticationFilter extends OncePerRequestFilter {    public TokenAuthenticationFilter() {    }    @Override    protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain chain) throws IOException, ServletException {        logger.info("uri:"+request.getRequestURI());        //如果是登录接口,直接放行        if("/admin/system/index/login".equals(request.getRequestURI())) {            chain.doFilter(request, response);            return;        }        UsernamePasswordAuthenticationToken authentication = getAuthentication(request);//获取请求的对象封装为spring-security的对象        //如果对象存在        if(null != authentication) {            SecurityContextHolder.getContext().setAuthentication(authentication);//将对象存至SecurityContext(上下文均可使用)            chain.doFilter(request, response);//对所有资源进行放行        } else {            ResponseUtil.out(response, Result.build(null, ResultCodeEnum.LOGIN_MOBLE_ERROR));        }    }    private UsernamePasswordAuthenticationToken getAuthentication(HttpServletRequest request) {        // token置于header里        String token = request.getHeader("token");        logger.info("token:"+token);        if (!StringUtils.isEmpty(token)) {            String useruame = JwtHelper.getUsername(token);            logger.info("useruame:"+useruame);            if (!StringUtils.isEmpty(useruame)) {                return new UsernamePasswordAuthenticationToken(useruame, null, Collections.emptyList());            }        }        return null;    }}

2.2.3、在配置类配置相关认证类

@Configuration@EnableWebSecurity //@EnableWebSecurity是开启SpringSecurity的默认行为public class WebSecurityConfig extends WebSecurityConfigurerAdapter {    @Autowired    private UserDetailsService userDetailsService;    @Autowired    private CustomMd5PasswordEncoder customMd5PasswordEncoder;    @Bean    @Override    protected AuthenticationManager authenticationManager() throws Exception {        return super.authenticationManager();    }    //由于博主正在写前后端分离的项目,下面有些不是前后端分离的可以不用加    @Override    protected void configure(HttpSecurity http) throws Exception {        // 这是配置的关键,决定哪些接口开启防护,哪些接口绕过防护        http                //关闭csrf跨站请求伪造                .csrf().disable()                // 开启跨域以便前端调用接口                .cors().and()                .authorizeRequests()                // 指定某些接口不需要通过验证即可访问。登陆接口肯定是不需要认证的                .antMatchers("/admin/system/index/login").permitAll()                // 这里意思是其它所有接口需要认证才能访问                .anyRequest().authenticated()                .and()                //TokenAuthenticationFilter放到UsernamePasswordAuthenticationFilter的前面,这样做就是为了除了登录的时候去查询数据库外,其他时候都用token进行认证。                .addFilterBefore(new TokenAuthenticationFilter(), UsernamePasswordAuthenticationFilter.class)                .addFilter(new TokenLoginFilter(authenticationManager()));        //禁用session        http.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS);    }    @Override    protected void configure(AuthenticationManagerBuilder auth) throws Exception {        // 指定UserDetailService和加密器        auth.userDetailsService(userDetailsService)                .passwordEncoder(customMd5PasswordEncoder);    }        @Override    public void configure(WebSecurity web) throws Exception {        web.ignoring().antMatchers("/favicon.ico","/swagger-resources    @ExceptionHandler(AccessDeniedException.class)    public Result error(AccessDeniedException e) throws AccessDeniedException {        return Result.build(null).code(204).message("没有权限访问");    }

来源地址:https://blog.csdn.net/qq_61544409/article/details/129685347

--结束END--

本文标题: SpringSecurity权限控制

本文链接: https://www.lsjlt.com/news/395346.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • SpringSecurity权限控制
    目录 1、Spring Security简介 2、Spring Security实现权限 2.1、Spring Security入门 2.1.1、修改pom文件 2.1.2、添加配置类 2.2、用户认证 2.2.1、自定义组件 2.2.2、...
    99+
    2023-09-05
    spring java 后端
  • SpringSecurity怎样使用注解控制权限
    一般的系统在权限设计上,都会分为角色、权限(RDBC),复杂一点的可能会有用户组、组织之类的概念。 用户的权限是写死的,对应于后台的接口或者资源,是没办法改变的,一般不对用户开放修改...
    99+
    2024-04-02
  • 怎么在项目中应用SpringSecurity权限控制
    本篇内容主要讲解“怎么在项目中应用SpringSecurity权限控制”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么在项目中应用SpringSecurity权限控制”吧!要进行认证和授权需要...
    99+
    2023-07-02
  • 详解如何在项目中应用SpringSecurity权限控制
    目录1、Spring Security环境准备2、实现认证和授权3、在控制器上实现注解鉴权4、请求获取当前登录的用户名信息5、用户退出要进行认证和授权需要前面课程中提到的权限模型涉及...
    99+
    2024-04-02
  • SpringBoot整合SpringSecurity实现权限控制之实现多标签页
    目录一、需求描述二、前端实现三、效果演示四、源码一、需求描述 多标签页 (Tabs) 的设计对于多窗口多任务管理有着无与伦比的高效率与方便性 在上面的文章中已经实现了后台管理的基...
    99+
    2024-04-02
  • Vue权限指令控制权限详解
    目录第一种-自定义权限指令第二种:v-if自定义控制最后说明在日常的开发过程中,我们除了使用Vue已有的指令之外,还需自定义指令,需要对DOM节点进一步操作。 在后台系统中,最常用的...
    99+
    2024-04-02
  • kafkatopic权限控制(设置删除权限)
    Kafka是由Apache软件基金会开发的一个开源流处理平台,由Scala和Java编写。Kafka是一种高吞吐量的分布式发布订阅消息系统,它可以处理消费者在网站中的所有动作流数据。...
    99+
    2024-04-02
  • SpringBoot如何整合Springsecurity实现数据库登录及权限控制
    目录第一步第二步是封装一个自定义的类第三步, 我们需要判断密码啦总结我们今天使用SpringBoot来整合SpringSecurity,来吧,不多BB 首先呢,是一个SpringBo...
    99+
    2024-04-02
  • SpringBoot怎么整合Springsecurity实现数据库登录及权限控制
    这篇文章主要为大家展示了“SpringBoot怎么整合Springsecurity实现数据库登录及权限控制”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“SpringBoot怎么整合Springs...
    99+
    2023-06-22
  • Python权限控制模块Casbin
    目录简介为什么我要使用 Casbin?PyCasbin 模块的使用例子权限测试简介 Casbin是一个强大的、高效的开源访问控制框架,其权限管理机制支持多种访问控制模型。 casbi...
    99+
    2024-04-02
  • vue2+springsecurity权限系统的实现
    目录准备内容JWT 校验用户的凭证(头部,载荷,签证)SpringSecurity 权限控制配置 SpringSecurity准备内容 新建项目,SpringBoot采用2.7.11...
    99+
    2023-05-18
    vue springsecurity权限 vue springsecurity
  • C++控制权限关键字protected
    文章转自公众号:Coder梁(ID:Coder_LT) 关键字protected与private相似,在类外只能用公有类成员来访问protected成员。只有在派生的时候,priva...
    99+
    2024-04-02
  • vue按钮权限控制介绍
    目录一、步骤 1.定义buttom权限 2.定义store 3.创建permission指令 4.使用permission指令 5.删除无权限数据 6.传入状态管理数据 二、概况 前...
    99+
    2024-04-02
  • Discuz权限控制:了解如何设置阅读权限
    Discuz权限控制:了解如何设置阅读权限,需要具体代码示例 在Discuz论坛中,权限控制是非常重要的一项功能,可以帮助管理员精确地控制用户的操作和访问权限,保护论坛的安全和秩序。其...
    99+
    2024-03-10
    权限控制 discuz 阅读权限
  • SAP 价格显示权限控制
    SAP 价格显示权限控制  http://mp.weixin.qq.com/s__biz=MzA5NzUxMTExNg==&mid=2653462715&idx=2&sn=538d2ea7ce23...
    99+
    2023-06-05
  • Spring Security权限管理实现接口动态权限控制
    目录摘要前置知识数据库设计数据库表结构数据库表介绍ums_adminums_roleums_admin_role_relationums_menuums_resourceums_re...
    99+
    2024-04-02
  • MySQL中如何限制用户权限和访问控制
    在MySQL中,可以通过以下几种方法限制用户权限和访问控制: 使用GRANT语句授予或撤销用户权限。GRANT语句允许管理员为用...
    99+
    2024-03-06
    MySQL
  • PHP权限控制修饰符详解:全面了解常用的权限控制修饰符
    PHP权限控制修饰符详解:全面了解常用的权限控制修饰符,需要具体代码示例 在 PHP 开发中,权限控制是一个非常重要的概念,能够有效地保证代码的安全性和可维护性。而在权限控制中,修饰符则是必不可少的元素。在 PHP 中具有三种修...
    99+
    2024-01-19
    PHP 权限控制 修饰符
  • React 组件权限控制的实现
    目录前话正文1. 控制方式1.1 直接计算1.2 通用权限Hoc1.3 权限包裹组件2. 控制结果2.1 显隐控制2.2 自定义渲染3. 权限数据3.1 静态权限3.2 动态权限前话...
    99+
    2024-04-02
  • MongoDb中怎么控制用户权限
    今天就跟大家聊聊有关MongoDb中怎么控制用户权限,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。Mongodb创建用户的语法在不用的版本之间还是不...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作