yii2 后台权限验证获取用户身份_Spring Boot 2.X(十八):Spring Security-登录认证和权限控制...

760ef2a263c348b7c3dd6bb62c0169a2.png

前言

在企业项目开发中,对系统的安全和权限控制往往是必需的,常见的安全框架有 Spring Security、Apache Shiro 等。本文主要简单介绍一下 Spring Security,再通过 Spring Boot 集成开一个简单的示例。

Spring Security

什么是 Spring Security?

Spring Security 是一种基于 Spring AOP 和 Servlet 过滤器 Filter 的安全框架,它提供了全面的安全解决方案,提供在 Web 请求和方法调用级别的用户鉴权和权限控制。

Web 应用的安全性通常包括两方面:用户认证(Authentication)和用户授权(Authorization)。

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

用户授权指的是验证某个用户是否有权限执行某个操作。

2.原理

Spring Security 功能的实现主要是靠一系列的过滤器链相互配合来完成的。以下是项目启动时打印的默认安全过滤器链(集成5.2.0):

[    org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter@5054e546,    org.springframework.security.web.context.SecurityContextPersistenceFilter@7b0c69a6,    org.springframework.security.web.header.HeaderWriterFilter@4fefa770,    org.springframework.security.web.csrf.CsrfFilter@6346aba8,    org.springframework.security.web.authentication.logout.LogoutFilter@677ac054,    org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter@51430781,    org.springframework.security.web.savedrequest.RequestCacheAwareFilter@4203d678,    org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter@625e20e6,    org.springframework.security.web.authentication.AnonymousAuthenticationFilter@19628fc2,    org.springframework.security.web.session.SessionManagementFilter@471f8a70,    org.springframework.security.web.access.ExceptionTranslationFilter@3e1eb569,    org.springframework.security.web.access.intercept.FilterSecurityInterceptor@3089ab62]
  • WebAsyncManagerIntegrationFilter
  • SecurityContextPersistenceFilter
  • HeaderWriterFilter
  • CsrfFilter
  • LogoutFilter
  • UsernamePasswordAuthenticationFilter
  • RequestCacheAwareFilter
  • SecurityContextHolderAwareRequestFilter
  • AnonymousAuthenticationFilter
  • SessionManagementFilter
  • ExceptionTranslationFilter
  • FilterSecurityInterceptor

详细解读可以参考:https://blog.youkuaiyun.com/dushiwodecuo/article/details/78913113

3.核心组件

SecurityContextHolder

用于存储应用程序安全上下文(Spring Context)的详细信息,如当前操作的用户对象信息、认证状态、角色权限信息等。默认情况下,SecurityContextHolder 会使用 ThreadLocal 来存储这些信息,意味着安全上下文始终可用于同一执行线程中的方法。

获取有关当前用户的信息

因为身份信息与线程是绑定的,所以可以在程序的任何地方使用静态方法获取用户信息。例如获取当前经过身份验证的用户的名称,代码如下:

Object principal = SecurityContextHolder.getContext().getAuthentication().getPrincipal();if (principal instanceof UserDetails) {    String username = ((UserDetails)principal).getUsername();} else {    String username = principal.toString();}

其中,getAuthentication() 返回认证信息,getPrincipal() 返回身份信息,UserDetails 是对用户信息的封装类。

Authentication

认证信息接口,集成了 Principal 类。该接口中方法如下:

接口方法功能说明getAuthorities()获取权限信息列表,默认是 GrantedAuthority 接口的一些实现类,通常是代表权限信息的一系列字符串getCredentials()获取用户提交的密码凭证,用户输入的密码字符窜,在认证过后通常会被移除,用于保障安全getDetails()获取用户详细信息,用于记录 ip、sessionid、证书序列号等值getPrincipal()获取用户身份信息,大部分情况下返回的是 UserDetails 接口的实现类,是框架中最常用的接口之一

AuthenticationManager

认证管理器,负责验证。认证成功后,AuthenticationManager 返回一个填充了用户认证信息(包括权限信息、身份信息、详细信息等,但密码通常会被移除)的 Authentication 实例。然后再将 Authentication 设置到 SecurityContextHolder 容器中。

AuthenticationManager 接口是认证相关的核心接口,也是发起认证的入口。但它一般不直接认证,其常用实现类 ProviderManager 内部会维护一个 List 列表,存放里多种认证方式,默认情况下,只需要通过一个 AuthenticationProvider 的认证,就可被认为是登录成功。

UserDetailsService

负责从特定的地方加载用户信息,通常是通过JdbcDaoImpl从数据库加载实现,也可以通过内存映射InMemoryDaoImpl实现。

UserDetails

该接口代表了最详细的用户信息。该接口中方法如下:

接口方法功能说明getAuthorities()获取授予用户的权限getPassword()获取用户正确的密码,这个密码在验证时会和 Authentication 中的 getCredentials() 做比对getUsername()获取用于验证的用户名isAccountNonExpired()指示用户的帐户是否已过期,无法验证过期的用户isAccountNonLocked()指示用户的账号是否被锁定,无法验证被锁定的用户isCredentialsNonExpired()指示用户的凭据(密码)是否已过期,无法验证凭证过期的用户isEnabled()指示用户是否被启用,无法验证被禁用的用户

Spring Security 实战

1.系统设计

本文主要使用 Spring Security 来实现系统页面的权限控制和安全认证,本示例不做详细的数据增删改查,sql 可以在完整代码里下载,主要是基于数据库对页面 和 ajax 请求做权限控制。

1.1 技术栈

  • 编程语言:Java
  • 编程框架:Spring、Spring MVC、Spring Boot
  • ORM 框架:MyBatis
  • 视图模板引擎:Thymeleaf
  • 安全框架:Spring Security(5.2.0)
  • 数据库:MySQL
  • 前端:Layui、JQuery

1.2 功能设计

  1. 实现登录、退出
  2. 实现菜单 url 跳转的权限控制
  3. 实现按钮 ajax 请求的权限控制
  4. 防止跨站请求伪造(CSRF)攻击

1.3 数据库层设计

t_user 用户表

字段类型长度是否为空说明idint8否主键,自增长usernamevarchar20否用户名passwordvarchar255否密码

t_role 角色表

字段类型长度是否为空说明idint8否主键,自增长role_namevarchar20否角色名称

t_menu 菜单表

字段类型长度是否为空说明idint8否主键,自增长menu_namevarchar20否菜单名称menu_urlvarchar50是菜单url(Controller 请求路径)

t_user_roles 用户权限表

字段类型长度是否为空说明idint8否主键,自增长user_idint8否用户表idrole_idint8否角色表id

t_role_menus 权限菜单表

字段类型长度是否为空说明idint8否主键,自增长role_idint8否角色表idmenu_idint8否菜单表id

实体类这里不详细列了。

2.代码实现

2.0 相关依赖

org.springframework.boot            spring-boot-starter-web        org.springframework.boot            spring-boot-starter-test            testorg.junit.vintage                    junit-vintage-engine                org.springframework.boot            spring-boot-starter-jdbc        org.springframework.boot            spring-boot-devtools            truemysql            mysql-connector-java            runtimeorg.mybatis.spring.boot            mybatis-spring-boot-starter            2.1.0org.springframework.boot            spring-boot-starter-thymeleaf        com.alibaba            fastjson            1.2.47org.springframework.boot            spring-boot-starter-security        

2.1 继承 WebSecurityConfigurerAdapter 自定义 Spring Security 配置

/**prePostEnabled :决定Spring Security的前注解是否可用 [@PreAuthorize,@PostAuthorize,..]secureEnabled : 决定是否Spring Security的保障注解 [@Secured] 是否可用jsr250Enabled :决定 JSR-250 annotations 注解[@RolesAllowed..] 是否可用. */@Configurable@EnableWebSecurity//开启 Spring Security 方法级安全注解 @EnableGlobalMethodSecurity@EnableGlobalMethodSecurity(prePostEnabled = true,securedEnabled = true,jsr250Enabled = true)public class WebSecurityConfig extends WebSecurityConfigurerAdapter{    @Autowired    private CustomAccessDeniedHandler customAccessDeniedHandler;    @Autowired    private UserDetailsService userDetailsService;        /**     * 静态资源设置     */    @Override    public void configure(WebSecurity webSecurity) {        //不拦截静态资源,所有用户均可访问的资源        webSecurity.ignoring().antMatchers(                "/",                "/css/**",                "/js/**",                "/images/**",                "/layui/**"                );    }    /**     * http请求设置     */    @Override    public void configure(HttpSecurity http) throws Exception {        //http.csrf().disable(); //注释就是使用 csrf 功能                http.headers().frameOptions().disable();//解决 in a frame because it set 'X-Frame-Options' to 'DENY' 问题                    //http.anonymous().disable();        http.authorizeRequests()            .antMatchers("/login/**","/initUserData")//不拦截登录相关方法                    .permitAll()                    //.antMatchers("/user").hasRole("ADMIN")  // user接口只有ADMIN角色的可以访问//            .anyRequest()//            .authenticated()// 任何尚未匹配的URL只需要验证用户即可访问            .anyRequest()            .access("@rbacPermission.hasPermission(request, authentication)")//根据账号权限访问                        .and()            .formLogin()            .loginPage("/")            .loginPage("/login")   //登录请求页            .loginProcessingUrl("/login")  //登录POST请求路径            .usernameParameter("username") //登录用户名参数            .passwordParameter("password") //登录密码参数            .defaultSuccessUrl("/main")   //默认登录成功页面            .and()            .exceptionHandling()            .accessDeniedHandler(customAccessDeniedHandler) //无权限处理器            .and()            .logout()            .logoutSuccessUrl("/login?logout");  //退出登录成功URL                }    /**     * 自定义获取用户信息接口     */    @Override    public void configure(AuthenticationManagerBuilder auth) throws Exception {        auth.userDetailsService(userDetailsService).passwordEncoder(passwordEncoder());    }        /**     * 密码加密算法     * @return     */    @Bean    public BCryptPasswordEncoder passwordEncoder() {        return new BCryptPasswordEncoder();     }}

2.2 自定义实现 UserDetails 接口,扩展属性

public class UserEntity implements UserDetails {    /**     *      */    private static final long serialVersionUID = -9005214545793249372L;    private Long id;// 用户id    private String username;// 用户名    private String password;// 密码    private List userRoles;// 用户权限集合    private List
roleMenus;// 角色菜单集合 private Collection extends GrantedAuthority> authorities; public UserEntity() { } public UserEntity(String username, String password, Collection extends GrantedAuthority> authorities, List roleMenus) { this.username = username; this.password = password; this.authorities = authorities; this.roleMenus = roleMenus; } public Long getId() { return id; } public void setId(Long id) { this.id = id; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public List getUserRoles() { return userRoles; } public void setUserRoles(List userRoles) { this.userRoles = userRoles; } public List getRoleMenus() { return roleMenus; } public void setRoleMenus(List roleMenus) { this.roleMenus = roleMenus; } @Override public Collection extends GrantedAuthority> getAuthorities() { return this.authorities; } @Override public boolean isAccountNonExpired() { return true; } @Override public boolean isAccountNonLocked() { return true; } @Override public boolean isCredentialsNonExpired() { return true; } @Override public boolean isEnabled() { return true; }}

2.3 自定义实现 UserDetailsService 接口

/** * 获取用户相关信息 * @author charlie * */@Servicepublic class UserDetailServiceImpl implements UserDetailsService {    private Logger log = LoggerFactory.getLogger(UserDetailServiceImpl.class);    @Autowired    private UserDao userDao;    @Autowired    private RoleDao roleDao;    @Autowired    private MenuDao menuDao;    @Override    public UserEntity loadUserByUsername(String username) throws UsernameNotFoundException {        // 根据用户名查找用户        UserEntity user = userDao.getUserByUsername(username);        System.out.println(user);        if (user != null) {            System.out.println("UserDetailsService");            //根据用户id获取用户角色            List roles = roleDao.getUserRoleByUserId(user.getId());            // 填充权限            Collection authorities = new HashSet();            for (Role role : roles) {                authorities.add(new SimpleGrantedAuthority(role.getRoleName()));            }            //填充权限菜单            List
menus=menuDao.getRoleMenuByRoles(roles); return new UserEntity(username,user.getPassword(),authorities,menus); } else { System.out.println(username +" not found"); throw new UsernameNotFoundException(username +" not found"); } }}

2.4 自定义实现 URL 权限控制

/** * RBAC数据模型控制权限 * @author charlie * */@Component("rbacPermission")public class RbacPermission{    private AntPathMatcher antPathMatcher = new AntPathMatcher();    public boolean hasPermission(HttpServletRequest request, Authentication authentication) {        Object principal = authentication.getPrincipal();        boolean hasPermission = false;        if (principal instanceof UserEntity) {            // 读取用户所拥有的权限菜单            List
menus = ((UserEntity) principal).getRoleMenus(); System.out.println(menus.size()); for (Menu menu : menus) { if (antPathMatcher.match(menu.getMenuUrl(), request.getRequestURI())) { hasPermission = true; break; } } } return hasPermission; }}

2.5 实现 AccessDeniedHandler

自定义处理无权请求

/** * 处理无权请求 * @author charlie * */@Componentpublic class CustomAccessDeniedHandler implements AccessDeniedHandler {    private Logger log = LoggerFactory.getLogger(CustomAccessDeniedHandler.class);    @Override    public void handle(HttpServletRequest request, HttpServletResponse response,            AccessDeniedException accessDeniedException) throws IOException, ServletException {        boolean isAjax = ControllerTools.isAjaxRequest(request);        System.out.println("CustomAccessDeniedHandler handle");        if (!response.isCommitted()) {            if (isAjax) {                String msg = accessDeniedException.getMessage();                log.info("accessDeniedException.message:" + msg);                String accessDenyMsg = "{"code":"403","msg":"没有权限"}";                ControllerTools.print(response, accessDenyMsg);            } else {                request.setAttribute(WebAttributes.ACCESS_DENIED_403, accessDeniedException);                response.setStatus(HttpStatus.FORBIDDEN.value());                RequestDispatcher dispatcher = request.getRequestDispatcher("/403");                dispatcher.forward(request, response);            }        }    }    public static class ControllerTools {        public static boolean isAjaxRequest(HttpServletRequest request) {            return "XMLHttpRequest".equals(request.getHeader("X-Requested-With"));        }        public static void print(HttpServletResponse response, String msg) throws IOException {            response.setCharacterEncoding("UTF-8");            response.setContentType("application/json; charset=utf-8");            PrintWriter writer = response.getWriter();            writer.write(msg);            writer.flush();            writer.close();        }    }}

2.6 相关 Controller

登录/退出跳转

/** * 登录/退出跳转 * @author charlie * */@Controllerpublic class LoginController {    @GetMapping("/login")    public ModelAndView login(@RequestParam(value = "error", required = false) String error,            @RequestParam(value = "logout", required = false) String logout) {        ModelAndView mav = new ModelAndView();        if (error != null) {            mav.addObject("error", "用户名或者密码不正确");        }        if (logout != null) {            mav.addObject("msg", "退出成功");        }        mav.setViewName("login");        return mav;    }}

登录成功跳转

@Controllerpublic class MainController {    @GetMapping("/main")    public ModelAndView toMainPage() {        //获取登录的用户名        Object principal= SecurityContextHolder.getContext().getAuthentication().getPrincipal();        String username=null;        if(principal instanceof UserDetails) {            username=((UserDetails)principal).getUsername();        }else {            username=principal.toString();        }        ModelAndView mav = new ModelAndView();        mav.setViewName("main");        mav.addObject("username", username);        return mav;    }    }

用于不同权限页面访问测试

/** * 用于不同权限页面访问测试 * @author charlie * */@Controllerpublic class ResourceController {    @GetMapping("/publicResource")    public String toPublicResource() {        return "resource/public";    }        @GetMapping("/vipResource")    public String toVipResource() {        return "resource/vip";    }}

用于不同权限ajax请求测试

/** * 用于不同权限ajax请求测试 * @author charlie * */@RestController@RequestMapping("/test")public class HttptestController {    @PostMapping("/public")    public JSONObject doPublicHandler(Long id) {        JSONObject json = new JSONObject();        json.put("code", 200);        json.put("msg", "请求成功" + id);        return json;    }    @PostMapping("/vip")    public JSONObject doVipHandler(Long id) {        JSONObject json = new JSONObject();        json.put("code", 200);        json.put("msg", "请求成功" + id);        return json;    }}

2.7 相关 html 页面

登录页面

            

防止跨站请求伪造(CSRF)攻击

退出系统

                                                            退出系统

ajax 请求页面

公共权限请求按钮

VIP权限请求按钮

2.8 测试

测试提供两个账号:user 和 admin (密码与账号一样)

由于 admin 作为管理员权限,设置了全部的访问权限,这里只展示 user 的测试结果。

4feef44570e9174c0c81707c654c69fa.png
693842b20b02a105f4a195473f8b6b8e.png
ba26fa9857997400fc6c9aaa76532433.png
7d5c759056ae25e17b0a77a7d65e4220.png
使用Yii 2的RBAC进行权限设置和验证 通过以上步骤,您可以使用Yii 2的RBAC进行权限设置和验证。定义角色和权限,关联它们,定义规则和规则验证器,最后进行权限验证。RBAC(基于角色的访问控制)是一种常用的权限管理模式,Yii 2框架提供了强大的RBAC支持。在Yii 2中,我们可以通过设置规则和进行验证来实现RBAC。角色代表用户的角色,权限代表用户可以执行的操作。现在我们已经定义了角色、权限、规则和规则验证器,可以开始进行权限验证了。在进行权限验证时,我们可以使用规则来进一步细化权限。一旦定义了角色和权限,我们就可以将它们进行关联。 阅读详情

相关推荐

Calibre电子书阅读器个性化样式定制指南

本文详细介绍了如何通过Calibre电子书阅读器的用户样式表功能进行深度个性化样式定制。从修改全局字体、行距、背景配色(包括深色/浅色模式)到美化代码块、引用等特殊元素,本指南提供了完整的CSS代码示例与实战技巧,帮助用户打造专属的舒适阅读环境,显著提升电子书阅读体验。

vv45678的博客 919

java 权限url权限_Spring Boot 2.X(十八):Spring Security-登录认证和权限控制

前言在企业项目开发中,对系统的安全和权限控制往往是必需的,常见的安全框架有 Spring Security、Apache Shiro 等。本文主要简单介绍一下 Spring Security,再通过 Spring Boot 集成开一个简单的示例。Spring Security什么是 Spring Security?Spring Security 是一种基于 Spring AOP 和 Servlet...

weixin_39783149的博客 392

关于Selenium3在MicrosoftEdge浏览器中出现的问题

前言 最近在做web自动化测试,所用环境是java+selenium3.141.59+MicrosoftEdge(Chromium)浏览器。 在调试的过程中,出现了很多问题。比如selenium3在Edge浏览器中远程调用中,不支持addArguments方法等 问题 1.Edge浏览器弹窗问题 在测试过程中,会出现弹出窗提示 ...

zhucheng1994的博客 2185

Yii2 restful接口方式开发,权限控制(yii2-rest-rbac)

> 根据yii2-admin(https://github.com/mdmsoft/yii2-admin)修改,yii2-admin只是web方式,这个相当于yii2-admin的rest版本。适合用于前后端分离项目,rest方式提供接口,实现对接口的权限控制。项目地址:https://github.com/windhoney/yii2-rest-rbac# yii2-rest-rbac&g...

qq_20739429的博客 1799

从理论到实践:利用FilterSolutions高效设计7阶椭圆低通滤波器

本文详细介绍了如何利用FilterSolutions软件高效设计7阶椭圆低通滤波器。文章从理论入手,对比了巴特沃斯、切比雪夫等经典滤波器特性,阐述了在要求高衰减陡度(如62dB抑制)和严格通带波纹(0.2dB)时,椭圆滤波器是最优选择。通过分步实战教程,指导读者完成从软件参数设置、性能验证到实际电路布局与调试的全过程,助力射频与高速数字信号处理工程师将理论转化为可靠设计。

jupi8的博客 555

浙政钉H5应用上架实战:从环境配置到发布避坑指南

本文详细解析浙政钉H5应用上架全流程,从环境配置到发布避坑指南。重点介绍Vue 2.6 + Node 14.21.3的稳定开发环境搭建、项目结构规范及常见报错解决方案,帮助开发者高效完成浙政钉H5应用上架流程。

weixin_27943395的博客 284

梳理一下若依框架的权限过滤系统

Spring Security是一个强大且易于使用的框架,可以帮助开发人员提高应用程序的安全性和可靠性。若依框架通过结合Spring Security、自定义权限服务类和权限上下文管理工具,实现了一套灵活且方便集成的权限过滤系统。这段代码提供了一个简单的权限上下文管理工具,使得在应用中能够方便地设置和获取权限信息,通常在处理请求时,可以使用这些工具方法来确保在请求处理过程中能够方便地传递和获取权限信息。这个服务类的作用是简化在代码中进行权限验证的逻辑,通过提供这些方法,可以更方便地进行权限控制。

IT小辉同学 3753

java三角套利_三角对冲套利-EA原理全解析

它是两个直盘货币和一个交叉盘货币之间的相互对冲,交易员往往受到外界因素的影响无法严格执行造成亏损。该系统经过大量数据统计分析和严格的科学论证计算,并通过多年实盘交易验证可以达到稳定盈利。希望交易员严格按照交易规则执行。此策略利用交叉外汇对的市场价格与其合成价格的价差来实现套利,还以EUR/USD和GBP为例:1,我们关注三个外汇对:EUR/USD,GBP/USD,以及GBP/EUR2,计算GBP/...

weixin_29531897的博客 2415

yii2basic模版之:8:得到登录的用户名

Yii::$app->user->identity->username

安然 602

CADENCE 25.1打开元件库ERRORCannot perform the operation because of an exception.

摘要:解决CADENCE25.1打开元件库报错"ERRORCannotperformtheoperationbecauseofanexception"的方法:该错误通常由软件中文设置导致。解决方案为:进入Options→Preferences→MorePreferences,取消勾选两个本地语言选项后重启软件即可恢复正常。此方法简单有效,能快速解决因语言设置导致的元件库访问异常问题。(98字)

0 1006

把 SAP Workflow 的 Task 搞懂:从 TS 到 WS 的建模、触发与排错全景

摘要:SAP Business Workflow中的Task是工作流设计的核心单元,分为single-step(独立执行)和multistep(流程编排)两种类型。Task设计直接影响流程的可复用性、扩展性和可排错性。系统将Task分为5类(TS/T/WS/WF/TG),运行时通过事件触发、Linkage匹配、Work Item执行的链路完成流程驱动。关键事务码包括PFTC_INS(创建Task)、SWE2(事件配置)等。正确设计Task边界并遵循"先业务提交后事件触发"原则,是构建稳定

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 271

权限校验—接口检验

获取传入用户的信息判断用户信息的权限信息集合中是否含有定义的权限/*** @Description: 自定义权限实现*//** 所有权限标识 *//*** 验证用户是否具备某权限* @param permission 权限字符串* @return 用户是否具备某权限*///判断是否传入权限字符//获取用户信息//判断是否有用户信息,或者用户信息中是否包含权限集合//将权限设置到请求头中//判断是否包含权限/*** 判断是否包含权限。

一起加油吧~ 5233

【Claude】组织级认证限制报错已解决(4 种)

报错被禁用的是什么谁能解除应急方案整个 Console 组织Anthropic 支持换账户 / 订阅凭证API key 认证方式你的组织管理员用订阅/login订阅 OAuth 登录你的组织管理员用 API keyRoutines 功能你的组织所有者手动计划任务替代共同排查模式/status确认当前凭证;检查环境变量;看清报错消息里命名的是什么(key?组织访问?),对症清除;管理员层面的限制,找管理员解锁。

博客 1万+

SpringSecurity 自定义权限校验方法

SpringSecurity 自定义权限校验方法

weixin_46256404的博客 883

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

若依 数据权限图文详细理解及改造

若依的数据权限也是基于**角色**实现的,支持五种权限模式,按权限大小一次排列: - 全部数据权限,表示拥有所有部门的数据权限 · - 自定数据权限,表示拥有指定的若干部门的数据权限 - 本部门数据权限,表示仅拥有用户所属部门(不包括子部门)的数据权限 - 本部门及以下数据权限,表示仅拥有用户所属部门和所有子部门的数据权限 - 仅本人数据权限,表示仅拥有用户本人的数据权限

喜欢吃糖丶的博客 2万+

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

SpringSecurity不允许匿名(anonymous)访问Post接口(403)

问题1:系统对外暴露接口,接口路径配置了匿名访问(anonymous),Get请求可正常访问,Post请求报错403或直接跳转到登陆页。 问题2:前端传递token调用匿名接口,报错403,不传递token可正常访问。

secretdaixin的博客 2804

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

多个WebSecurityJAVA配置导致csrf().disable()配置失效

版本 spring-security-oauth2-2.3.8 问题 存在两个继承WebSecurityConfigurerAdapter的WebSecurity JAVA配置文件,一个配置了http.csrf().disable(),一个没有配置,请求仍然报错Invalid CSRF token found 解决 合并WEBSECURITY配置,或两个文件都配置上http.csrf().disable() 分析 Spring源码WebSecurityConfigurerAdapter中http默认配置启用

路过君的博客 2277

记使用spring security 后跨域配置失效的问题

之前项目使用的都是shiro,解决跨域问题都是实现WebMvcConfigurer接口,重写以下方法 @Override public void addCorsMappings(CorsRegistry registry) { registry.addMapping("/**") .allowCredentials(tru...

java-北京-菜鸟 4341

使用spring security框架实现权限以及登录,loadUserByUsername这个方法与authenticate这个方法执行顺序

Spring Security 是一个用于为 Java 应用程序提供安全保护的框架。 在使用 Spring Security 时,当用户尝试登录时,会执行以下步骤: 调用 authenticate() 方法进行身份验证,该方法需要用户提供的用户名和密码来尝试进行身份验证。 在进行身份验证之前,Spring Security 会调用 loadUserByUsername() 方法来获取用户信息。该...

weixin_35756637的博客 1591

java实验SpringSecurity用户权限控制详解

一.建立下面的三个数据库 CREATE TABLE `sys_role` ( `id` int(11) NOT NULL, `name` varchar(255) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; CREATE TABLE `sys_user` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(255) NOT NULL,

探长々 667

Spring Security 动态url权限控制

一、前言 本篇文章将讲述Spring Security 动态分配url权限,未登录权限控制,登录过后根据登录用户角色授予访问url权限 基本环境 spring-boot 2.1.8 mybatis-plus 2.2.0 mysql 数据库 maven项目 Spring Security入门学习可参考之前文章: SpringBoot集成Spring Security入门体验(一)https://blog.csdn.net/qq_38225558/article/details/101754743

mengfch的博客 2025

java实现用户登录_SpringSecurity动态加载用户角色权限实现登录及鉴权

很多人觉得Spring Security实现登录验证很难,我最开始学习的时候也这样觉得。因为我好久都没看懂我该怎么样将自己写的用于接收用户名密码的Controller与Spring Security结合使用,这是一个先入为主的误区。后来我搞懂了:根本不用你自己去写Controller。你只需要告诉Spring Security用户信息、角色信息、权限信息、登录页是什么?登陆成功页是什么?或者其他有...

weixin_39548606的博客 757

SpringBoot+Security+Jwt登录认证与权限控制(一)

SpringBoot+Security+Jwt登录认证与权限控制

weixin_48568302的博客 1849

权限信 息

*** 权限信息*/

qq_45718545的博客 312

【项目实践】后台管理系统前后端实践一:权限控制原理

整理了一套《前端大厂面试宝典》,包含了HTML、CSS、JavaScript、HTTP、TCP协议、浏览器、VUE、React、数据结构和算法,一共201道面试题,并对每个问题作出了回答和解析。有需要的小伙伴,可以点击文末卡片领取这份文档,无偿分享部分文档展示:文章篇幅有限,后面的内容就不一一展示了有需要的小伙伴,可以点下方卡片免费领取。

发果叁 2219

springSecurity系列之 SecurityContextHolder与SecurityContext

SecurityContextHolder SecurityContextHolder 是spring security 的基础工具类。这是一个工具类,只提供一些静态方法。这个工具类的目的是用来保存应用程序中当前使用人的安全上下文。将给定SecurityContext与当前执行线程关联。 官网介绍英文官网 SecurityContextHolder.getContext() 获取安全上下文SecurityContext。 安全上下文 SecurityContext SecurityContext 可以理

weixin_39802680的博客 1767
上一篇: python程序员语言_作为程序员必须掌握的三种语言
下一篇: 2 获取表名_获取MySQL分区表信息的几种方法
外币兑换
博客等级 码龄9年 38粉丝 1万+原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值