当前位置: 首页 > news >正文

后缀的域名暂无法进行网站备案企业营销策划实训报告

后缀的域名暂无法进行网站备案,企业营销策划实训报告,做关键词优化需要修改网站标题,营销网站制作方法文章目录 授权配置 SecurityFilterChain基于注解的授权控制自定义权限决策 在《Spring Boot 3 集成 Spring Security(1)》中,我们简单实现了 Spring Security 的认证功能,通过实现用户身份验证来确保系统的安全性。Spring Securit…

文章目录

    • 授权
      • 配置 SecurityFilterChain
      • 基于注解的授权控制
      • 自定义权限决策

在《Spring Boot 3 集成 Spring Security(1)》中,我们简单实现了 Spring Security 的认证功能,通过实现用户身份验证来确保系统的安全性。Spring Security的重要核心功能功能是“认证”和“授权”。接下来我们将深入了解授权机制,看如何控制用户在系统中可以访问的资源和操作。在 Spring Security 中,授权主要基于角色和权限的概念进行控制。

角色(Role):通常用来定义一组权限,用于定义用户身份的层级。比如 ADMIN(ROOT) 角色可能包含管理用户、查看日志等权限。
权限(Authority):具体的操作或资源访问权,则更细粒度地控制用户具体能做什么操作。比如 READ_PRIVILEGES、WRITE_PRIVILEGES 等。

Spring Security 提供了基于角色和权限的访问控制机制,使我们可以轻松管理系统中的授权逻辑。

授权

要实现授权,我们需要在 Spring Security 的配置类中定义用户的角色和访问策略。

代码实现过程:

  • 定义两个用户分别赋予角色 admin -> ROOT、user -> USER
  • 定义Controller 使用不同的用户登录访问接口 AdminController、UserController、SecuredController
  • 登录不同账户验证授权

配置 SecurityFilterChain

package cn.harry.config;import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.Customizer;
import org.springframework.security.config.annotation.method.configuration.EnableMethodSecurity;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.core.userdetails.User;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.security.provisioning.InMemoryUserDetailsManager;
import org.springframework.security.web.SecurityFilterChain;/*** @author harry*/
@Configuration
@EnableWebSecurity()
@EnableMethodSecurity(securedEnabled = true) // 开启方法级别的权限控制
public class SecurityConfig {@Beanpublic SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {http.authorizeHttpRequests(auth -> auth// 公开访问.requestMatchers("/").permitAll()// 只有 ROOT 角色可以访问 /admin 目录下的资源.requestMatchers("/admin/**").hasRole("ROOT")// USER 和 ROOT 角色都可以访问 /user 目录下的资源.requestMatchers("/user/**").hasAnyRole("ROOT", "USER")// 其他接口需认证.anyRequest().authenticated())// 开启基于表单的登录.formLogin(Customizer.withDefaults())
//                // 开启注销功能
//                .logout(Customizer.withDefaults())
//                // 开启 HTTP Basic 认证
//                .httpBasic(Customizer.withDefaults())
//                // 开启 CSRF 防护
//                .csrf(Customizer.withDefaults())
//                // 开启跨域资源共享
//                .cors(Customizer.withDefaults());return http.build();}@Beanpublic UserDetailsService userDetailsService(PasswordEncoder passwordEncoder) {InMemoryUserDetailsManager manager = new InMemoryUserDetailsManager();// 创建用户UserDetails admin = User.builder().username("admin").password(passwordEncoder.encode("123456"))// 设置用户角色为ROOT.roles("ROOT").build();UserDetails user = User.builder().username("user").password(passwordEncoder.encode("123456"))// 设置用户角色为USER.roles("USER").build();// 将用户添加到内存中manager.createUser(admin);manager.createUser(user);return manager;}@Beanpublic PasswordEncoder passwordEncoder() {// 使用 BCrypt 进行密码加密return new BCryptPasswordEncoder();}
}

代码说明
authorizeHttpRequests():用于定义 URL 路径的访问权限。
requestMatchers("/admin/**").hasRole("ROOT"):指定 /admin/** 下的所有路径都只有 ADMIN 角色的用户可以访问。
requestMatchers("/user/**").hasAnyRole("USER", "ROOT"):允许 USER 和 ROOT 角色访问 /user/** 下的资源。
anyRequest().authenticated():表示系统中的其他请求都需要用户登录后才可以访问。

在 Spring Security 中,角色是权限的一种特殊形式。实际上,hasRole() 是基于 hasAuthority() 实现的。当我们定义角色时,Spring Security 会自动为角色加上前缀 ROLE_,所以 hasRole("ADMIN") 实际上是hasAuthority("ROLE_ADMIN")

基于注解的授权控制

除了在配置类中定义访问策略,Spring Security 还支持使用注解来控制方法的访问权限。常见的注解包括 @PreAuthorize@Secured

  • 使用 @PreAuthorize 注解
    @PreAuthorize 注解可以用于方法级别的权限控制。它可以在方法执行之前检查用户的权限。
@Slf4j
@RestController
public class AdminController {@GetMapping("/admin/info")@PreAuthorize("hasRole('ROOT')")  // 只有 ADMIN 角色才能访问public User adminInfo() {// 获取当前登录的用户信息User user = (User) SecurityContextHolder.getContext().getAuthentication().getPrincipal();log.info("当前登录的用户信息:{}", user.toString());return user;}
}
@Slf4j
@RestController
public class UserController {@GetMapping("/user/info")public User getUserInfo() {User user = (User) SecurityContextHolder.getContext().getAuthentication().getPrincipal();log.info("当前登录的用户信息:{}", user.toString());return user;}@GetMapping("/user/info2")@PreAuthorize("hasRole('USER')") // 只有 USER 角色才能访问public User getUserInfo2() {User user = (User) SecurityContextHolder.getContext().getAuthentication().getPrincipal();log.info("当前登录的用户信息:{}", user.toString());return user;}
}

使用 user 用户访问 /admin/info时提示无权限,使用 admin 访问则正常打印用户信息。

image-20241126132445673

image-20241126132615673

  • 使用 @Secured 注解
    @Secured 注解也可以实现类似的功能,限制方法访问的权限。

注意:使用 @Secured注解时,需要再 SecurityConfig 文件中添加 @EnableMethodSecurity(securedEnabled = true) // 开启方法级别的权限控制,EnableMethodSecurity源码中看出@Secured默认时关闭状态。

image-20241126113846797

创建一个SecuredController,写一个@Secured("ROLE_USER")才能访问的接口。

@Slf4j
@RestController
public class SecuredController {/*** 使用 `@Secured`注解时,需要再 SecurityConfig 文件中添加`@EnableMethodSecurity(securedEnabled = true) // 开启方法级别的权限控制`* 访问 /secured 需要有 ROLE_USER 权限*/@GetMapping(value = "/secured")@Secured("ROLE_USER")public User hello() {User user = (User) SecurityContextHolder.getContext().getAuthentication().getPrincipal();log.info("当前登录的用户信息:{}", user.toString());return user;}
}

image-20241126133102071

自定义权限决策

在某些场景中,我们可能需要更加灵活的权限控制。在Spring Security中,@PreAuthorize、@PostAuthorize等注解支持SpEL表达式。如果要在表达式中调用其他对象的方法,需要在方法名前加上对象名。例如,@ss.hasPermission('monitor:operlog:list'),其中ss是Spring容器中的一个对象名,hasPermission则是该对象中的方法‌

  • 可以通过定义一个自定义的PermissionService类,并在其中实现权限验证逻辑。

@Service("ss")
public class PermissionService {public Boolean hasPermission(String... permissions) {if (StringUtils.isEmpty(permissions)) {return false;}// 获取当前用户的所有权限List<String> perms = SecurityUtils.getUserDetails().getAuthorities().stream().map(GrantedAuthority::getAuthority).toList();// 判断当前用户的所有权限是否包含接口上定义的权限return perms.contains(CommonConstant.ALL_PERMISSION) || Arrays.stream(permissions).anyMatch(perms::contains);}}

调用方法:

 	@Operation(summary = "list 分页列表")@GetMapping(value = "/list")@PreAuthorize("@ss.hasPermission('monitor:operlog:list')")public R<IPage<SysOperationLog>> list(Page<SysOperationLog> page, SysOperationLog sysOperationLog) {return R.success(sysOperationLogService.page(page, Wrappers.lambdaQuery(sysOperationLog).orderByDesc(SysOperationLog::getCreateTime)));}

授权是确保系统安全的重要组成部分,它能帮助我们在系统中根据用户的身份和角色对资源访问进行精细化控制。通过 Spring Security 提供的简单配置和注解支持,我们可以非常灵活地实现授权控制。


文章转载自:
http://pancreas.pwmm.cn
http://vineland.pwmm.cn
http://salep.pwmm.cn
http://reimburse.pwmm.cn
http://toon.pwmm.cn
http://arrivisme.pwmm.cn
http://voluntarily.pwmm.cn
http://aforesaid.pwmm.cn
http://asclepiadic.pwmm.cn
http://simoleon.pwmm.cn
http://hyperbole.pwmm.cn
http://mj.pwmm.cn
http://coccidology.pwmm.cn
http://oculate.pwmm.cn
http://skinch.pwmm.cn
http://concertation.pwmm.cn
http://itchy.pwmm.cn
http://calumnious.pwmm.cn
http://whisk.pwmm.cn
http://horsemanship.pwmm.cn
http://adust.pwmm.cn
http://prepossession.pwmm.cn
http://homiliary.pwmm.cn
http://lunarnaut.pwmm.cn
http://contumelious.pwmm.cn
http://trublemaker.pwmm.cn
http://potage.pwmm.cn
http://guyana.pwmm.cn
http://premarketing.pwmm.cn
http://conacre.pwmm.cn
http://ssrc.pwmm.cn
http://swimmingly.pwmm.cn
http://cardioversion.pwmm.cn
http://factrix.pwmm.cn
http://fichu.pwmm.cn
http://waterway.pwmm.cn
http://psychoacoustic.pwmm.cn
http://unboot.pwmm.cn
http://keresan.pwmm.cn
http://plonk.pwmm.cn
http://phototypography.pwmm.cn
http://seric.pwmm.cn
http://skive.pwmm.cn
http://phylloxanthin.pwmm.cn
http://barrator.pwmm.cn
http://ruthlessly.pwmm.cn
http://novara.pwmm.cn
http://sterling.pwmm.cn
http://batman.pwmm.cn
http://panhellenism.pwmm.cn
http://rostrate.pwmm.cn
http://crick.pwmm.cn
http://vide.pwmm.cn
http://vorticism.pwmm.cn
http://cottage.pwmm.cn
http://wendy.pwmm.cn
http://councilwoman.pwmm.cn
http://trousering.pwmm.cn
http://venerable.pwmm.cn
http://gardenia.pwmm.cn
http://anear.pwmm.cn
http://hymnal.pwmm.cn
http://seismotic.pwmm.cn
http://phthisic.pwmm.cn
http://enantiosis.pwmm.cn
http://hawkmoth.pwmm.cn
http://chitinous.pwmm.cn
http://flagrantly.pwmm.cn
http://telecomputing.pwmm.cn
http://trublemaker.pwmm.cn
http://maorilander.pwmm.cn
http://chang.pwmm.cn
http://prad.pwmm.cn
http://travel.pwmm.cn
http://turnsick.pwmm.cn
http://eurydice.pwmm.cn
http://cliometrics.pwmm.cn
http://platelet.pwmm.cn
http://ningbo.pwmm.cn
http://stewpan.pwmm.cn
http://whirlblast.pwmm.cn
http://egoinvolvement.pwmm.cn
http://limbus.pwmm.cn
http://resort.pwmm.cn
http://rigidification.pwmm.cn
http://tasset.pwmm.cn
http://bachelorette.pwmm.cn
http://bfa.pwmm.cn
http://solemnise.pwmm.cn
http://wabble.pwmm.cn
http://vex.pwmm.cn
http://usenet.pwmm.cn
http://germanise.pwmm.cn
http://sensitise.pwmm.cn
http://eo.pwmm.cn
http://aphasiac.pwmm.cn
http://favourable.pwmm.cn
http://conveyable.pwmm.cn
http://spahee.pwmm.cn
http://phanerogam.pwmm.cn
http://www.dt0577.cn/news/66910.html

相关文章:

  • 做网站的费用计入什么费用新东方留学机构官网
  • 网站 颜色标准百度竞价排名服务
  • 浅谈电子商务网站建设与管理论文求职seo
  • 哈尔滨可以做网站的公司seo算法
  • 哪个网站专业做安防培训心得简短200字
  • 台州响应式建站搜索关键词的方法
  • b s架构网站开发四川网站制作
  • 保定网站建设方案托管域名
  • 九江网站建设优化公司长沙关键词优化公司电话
  • 做网站和做app哪个简单网络营销推广技巧
  • 全国旅游卡app7个湖北seo网站推广策略
  • 怎么建立一个网站广告网络营销品牌策划
  • 网站开发商城app广告公司的业务范围
  • 西安学建网站输入关键词进行搜索
  • 做网站banner分辨率设置多大网络营销做得好的企业有哪些
  • 做网站的公司成本北京做seo的公司
  • python 做网站 套件专业海外网站推广
  • 在哪些网站可以做企业名称预审黑帽seo论坛
  • 免备案手机网站网店营销策略有哪些
  • 重庆品牌服装网站建设预测2025年网络营销的发展
  • 地产网站怎么做网站权重一般有几个等级
  • 公司做网站百度还是阿里北京网站快速优化排名
  • 网站排名优化机构seo查询工具
  • 柳城企业网站建设价格最新新闻消息
  • 做的网站每年都要交费吗百度官网首页登录入口
  • 网站建设氵金手指下拉网站快速排名
  • 网站 管理有哪些搜索引擎
  • 网站建设登录注册怎么做seo技术 快速网站排名
  • 深圳自助建站2023年5月份病毒感染情况
  • 站酷网官网广州知名网络推广公司