关于Shiro整合SpringBoot中,开发遇到的问题

  今天上午,接着学习老师发给我的视频,我发现对Shiro这个安全框架工具并不是十分了解,因此出了很多差错和毛病,也基本上是照葫芦画瓢,照着抄会,却完全看不懂.....

所以,这又遇到大问题了,就是关于不同角色认证,限制普通用户访问特殊路径的案例,卡了我一下午,都让我开始怀疑人生了!!!

  话不多说,上代码:

public class AuthRealm extends AuthorizingRealm {

    @Autowired
    private UserService userService;

    //认证登录
    @Override
    protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {     System.out.println("进入认证登录");
       // doGetAuthorizationInfo(null);
        UsernamePasswordToken usernamePasswordToken = (UsernamePasswordToken) token;
        String username = usernamePasswordToken.getUsername();
        User user = userService.findByUsername(username);
        return new SimpleAuthenticationInfo(user,user.getPassword(), this.getClass().getName());
    }

    //授权
    @Override
    protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {
        System.out.println("进入授权");
        User user = (User)principals.fromRealm(this.getClass().getName()).iterator().next();
        List<String> permissionList = new ArrayList<>();
        List<String> roleNameList = new ArrayList<>();
        Set<Role> roleSet = user.getRoles();
        if(!CollectionUtils.isEmpty(roleSet)){
            for (Role role :roleSet) {
                roleNameList.add(role.getRname());
                Set<Permission> permissionSet = role.getPermissions();
                if(!CollectionUtils.isEmpty(permissionSet)){
                    for (Permission permission: permissionSet) {
                        permissionList.add(permission.getPname());
                    }
                }
            }
        }
        SimpleAuthorizationInfo info = new SimpleAuthorizationInfo();

        info.addRoles(roleNameList);    //获得各用户所相对应的角色
        info.addStringPermissions(permissionList);
        return info;
    }

}

  在上面的代码中,我发现这俩个方法一个是用于登录的,还有一个用于授权的(就这个有毛病),但是在我启动项目的时候,只会进入登录的方法。而授权的默认是不开启的,只有做权限认证的时候(有三种情况下),才会启动,但是我的始终无法进入方法....而且还不报错。

 最终在我找啊找,找啊找,在网上查到好多相关的问题,但是都不对,要么就是说配置文件没配好,可我老师也压根没配他成功了,要么就说没加上注解。最终我自己发现问题,我和老师的代码有一处是不一样的,那就是我和他填入拦截信息的位置不一样,他的/**全路径过滤是放在最一行,而我的是把admin角色认证放在它下面了....这我当时就发现了,也没注意,没想到竟然是这个原因.....让我想了好久还是想不通(应该算个节点,在此之后的过滤拦截设置统统不生效)。

  图为我跟着配置的ShiroConfiguration,在这里,我看到老师指定权限路径为admin,判断是否为admin角色方可访问,我跟着写在了最后一行,这就导致doGetAuthorizationInfo方法未启动成功。也让我记住了一点,必须将/**的访问拦截放在最后一行!!

  真是一时粗心犯大错,自己不懂还不认真学习!以后再也不会皮了,还是老老实实专心敲代码吧,争取学够扎实,明年找到一份好工作!

原文地址:https://www.cnblogs.com/adsD/p/12230903.html

时间: 2024-10-28 17:30:53

关于Shiro整合SpringBoot中,开发遇到的问题的相关文章

教你 Shiro 整合 SpringBoot,避开各种坑

最近搞了下 Shiro 安全框架,找了一些网上的博客文章,但是一到自己实现的时候就遇到了各种坑,需要各种查资料看源码以及各种测试. 那么这篇文章就教大家如何将 Shiro 整合到 SpringBoot 中,并避开一些小坑,这次实现了基本的登陆以及角色权限,往后的文章也讲解了其他的功能,如 <教你 Shiro + SpringBoot 整合 JWT> 附上源码:https://github.com/HowieYuan/shiro 依赖包 <dependency> <groupI

shiro三连斩之第三斩,整合 springboot

shiro爱springboot中使用 ,还有thymeleaf前端框架.主要是如何配置 pom.xml配置依赖 <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:s

【java】使用 starter 的方式在 SpringBoot 中整合 Shiro

一开始跟着官方文档走, 就不吐槽官方文档使用的先进版本 1.5.0-SNAPSHOT 在 maven 仓库里压根就不存在这事了.我用的事 maven 里最新的版本. SpringBoot用的是 2.2.2-release <dependency> <groupId>org.apache.shiro</groupId> <artifactId>shiro-spring-boot-starter</artifactId> <version>

SpringBoot与Shiro整合

修改pom.xml: <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <

项目一:第十四天 1.在realm中动态授权 2.Shiro整合ehcache 缓存realm中授权信息 3.动态展示菜单数据 4.Quartz定时任务调度框架—Spring整合javamail发送邮件 5.基于poi实现分区导出

1 Shiro整合ehCache缓存授权信息 当需要进行权限校验时候:四种方式url拦截.注解.页面标签.代码级别,当需要验证权限会调用realm中的授权方法   Shiro框架内部整合好缓存管理器,整合ehcache环境,只需要配置即可.     <dependency> <groupId>net.sf.ehcache</groupId> <artifactId>ehcache-core</artifactId> <version>

SpringSecurity解决跨域问题,在SpringBoot整合SprinSecurity中如何用前后端分离Ajax登录,Ajax登录返回状态200还是近error

先说说SpringSecurity如何实现前后端分离Ajax登录? 今天使用SpringBoot整合SpringSecurity中想使用Ajax替代SpringSecurit的Form表单提交,在这里我们的提交方式还是使用表单提交 http.formLogin().loginProcessingUrl("/authentication/form") loginProcessingUrl方法表示你登录请求的地址,在这里SpringSecurity默认登录页面地址是/login ,填写了u

redis(Springboot中封装整合redis,java程序如何操作redis的5种基本数据类型)

平常测试redis操作命令,可能用的是cmd窗口 操作redis,记录一下 java程序操作reids, 操作redis的方法 可以用Jedis ,在springboot 提供了两种 方法操作 RedisTemplate 和StringRedisTemplate 两种方法的区别 可参考:https://blog.csdn.net/yifanSJ/article/details/79513179 当然 springboot 中也可以使用Jedis ,本次记录的是 如何使用RedisTemplate

Spring+SpringMVC+Hibernate 与 shiro 整合步骤

通过这篇文章你可以了解到: SSH 三大框架(spring + springMVC + Hiberante) 与 shiro 安全验证框架如何整合: 通过一个示例,快速理解 shiro 框架. [TOC] 1. 业务需求分析 用户 N - 角色 N - 权限 N 我们可以想象一下,在平时工作中的职务,比如:业务经理,部门主管等,他们拥有很多的权力,而一个公司中不会只有一个业务经理,也不会只有一个部门主管,如果我们要给不同的人分配职务权力时,每次都是具体的条条框框去分配,人累心也累.而如果我们事先

记录一下在SpringBoot中实现简单的登录认证

代码参考博客: https://blog.csdn.net/weixin_37891479/article/details/79527641 在做学校的课设的时候,发现了安全的问题,就不怀好意的用户有可能跳过登录直接访问系统的界面和使用里面的功能,于是想为系统加个安全验证.现在常用的安全框架我知道的就是Shiro还有SpringSecurity,但这次我不打算用框架,采用拦截器filter和session技术实现了一个基于session的登录认证. 先简单地说一下原理: session和cook