我了解到的面试的一些小内幕,五

那么第二个权限规则将不起作用,因为第一个权限规则覆盖了第二个权限规则

因为权限的设置是按照从上到下的优先级。及满足了最开始的权限设置,那么后面的设置就不起作用了。

2.2.Web授权实战

我们这一次在入门案例的基础上进行修改,所有的认证数据,授权数据都从数据库进行获取

1.编写controller

@RestController

public class DeptController {

@RequestMapping(“/dept/list”)

public String list(){

return “dept.list”;

}

@RequestMapping(“/dept/add”)

public String add(){

return “dept.add”;

}

@RequestMapping(“/dept/update”)

public String update(){

return “dept.update”;

}

@RequestMapping(“/dept/delete”)

public String delete(){

return “dept.delete”;

}

}


@RestController

public class EmployeeController {

@RequestMapping(“/employee/list”)

public String list(){

return “employee.list”;

}

@RequestMapping(“/employee/add”)

public String add(){

return “employee.add”;

}

@RequestMapping(“/employee/update”)

public String update(){

return “employee.update”;

}

@RequestMapping(“/employee/delete”)

public String delete(){

return “employee.delete”;

}

}

方法上的requestmapping就对应了权限表t_permission的资源

2.配置HttpSecurity

@Override

protected void configure(HttpSecurity http) throws Exception {

List permissions = permissionMapper.listPermissions();

ExpressionUrlAuthorizationConfigurer.ExpressionInterceptUrlRegistry

expressionInterceptUrlRegistry = http.csrf().disable() //关闭CSRF跨站点请求伪造防护

.authorizeRequests() //对请求做授权处理

.antMatchers(“/login”).permitAll() //登录路径放行

.antMatchers(“/login.html”).permitAll();//对登录页面跳转路径放行

//动态添加授权:从数据库动态查询出,哪些资源需要什么样的权限

for(Permission permission : permissions){

System.out.println(permission.getResource()+" - "+permission.getSn());

//如: /employee/list 需要 employee:list 权限才能访问

expressionInterceptUrlRegistry.antMatchers(permission.getResource()).hasAuthority(permission.getSn());

}

expressionInterceptUrlRegistry

.anyRequest().authenticated() //其他路径都要拦截

.and().formLogin() //允许表单登录, 设置登陆页

.successForwardUrl(“/loginSuccess”) // 设置登陆成功页

.loginPage(“/login.html”) //登录页面跳转地址

.loginProcessingUrl(“/login”) //登录处理地址

.and().logout().permitAll(); //登出

}

解释:上面代码从权限表查询出了所有的资源(对应controller中的Requestmapping路径),然后通过循环调用expressionInterceptUrlRegistry.antMatchers(permission.getResource())

.hasAuthority(permission.getSn()); 进行一一授权,指定哪个资源需要哪个权限才能访问。

3.修改UserDetailService加载用户权限

public UserDetails loadUserByUsername(String username) {

Login loginFromMysql = loginMapper.selectByUsername(username);

if(loginFromMysql == null){

throw new UsernameNotFoundException(“无效的用户名”);

}

//前台用户

List permissions = new ArrayList<>();

List permissionSnList =

systemManageClient.listByUserId(loginFromMysql.getId());

permissionSnList.forEach(permission->{

System.out.println(“用户:”+username+" :加载权限 :"+permission.getSn());

permissions.add(new SimpleGrantedAuthority(permission.getSn()));

});

return new User(username,loginFromMysql.getPassword(),permissions);

}

这里在通过UserDetailServer加载用户认证信息的时候就把用户的权限信息一并加载

4.登录测试

合理分配用户的权限,登录测试对于不同的资源是否应该有对应的访问权限

3.方法授权

SpringSecurity提供了一些授权的注解让我们可以在service,controller等的方法上贴注解进行授权,即在方法上指定方法方法需要什么样的权限才能访问

3.1.@Secured

标记方法需要有什么样的权限才能访问,这个注解需要在配置类上开启授权注解支持;

  • @EnableGlobalMethodSecurity(securedEnabled=true) ,然后在Controller方法上贴该注解如:

  • @Secured(“IS_AUTHENTICATED_ANONYMOUSLY”) :方法可以匿名访问

  • @Secured(“ROLE_DEPT”) ,需要拥有部门的角色才能访问,ROLE_前缀是固定的

1.开启Secured授权支持

@Configuration

@EnableGlobalMethodSecurity(securedEnabled = true)

public class WebSecurityConfig extends WebSecurityConfigurerAdapter {

2.使用@Secured进行方法授权

@RequestMapping(“/employee/list”)

@Secured(“ROLE_employee:list”)

public String list(){

return “employee.list”;

}

解释:这里使用了 @Secured(“ROLE_employee:list”) 意思是 “/employee/list” 这个资源需要“ROLE_employee:list”权限才能访问,如果认证的用户有该权限(UserDetailService中加载)包含了“ROLE_employee:list”即可访问该资源,否则不能访问。

注意:对于方法授权,没有贴注解的方法默认是匿名访问。@Secured注解授权是需要加上前缀“ROLE_”

3.2.@PreAuthorize

PreAuthorize适合进入方法前的权限验证,拥有和Secured同样的功能,甚至更强大,该注解需要在配置类开启:@EanbleGlobalMethodSecurity(prePostEnabled=true) 方法授权支持,然后在Controller贴注解如下:

  • @PreAuthorize(“isAnonymous()”) : 方法匿名访问
    自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)

img

总结

至此,文章终于到了尾声。总结一下,我们谈论了简历制作过程中需要注意的以下三个部分,并分别给出了一些建议:

  1. 技术能力:先写岗位所需能力,再写加分能力,不要写无关能力;
  2. 项目经历:只写明星项目,描述遵循 STAR 法则;
  3. 简历印象:简历遵循三大原则:清晰,简短,必要,要有的放矢,不要海投;

以及最后为大家准备的福利时间:简历模板+Java面试题+热门技术系列教程视频

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!
经历:只写明星项目,描述遵循 STAR 法则;
3. 简历印象:简历遵循三大原则:清晰,简短,必要,要有的放矢,不要海投;

以及最后为大家准备的福利时间:简历模板+Java面试题+热门技术系列教程视频

[外链图片转存中…(img-PZNZhSKS-1713468235838)]

[外链图片转存中…(img-3QKE0lsG-1713468235838)]

[外链图片转存中…(img-5pjCQA6z-1713468235838)]

《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值