关于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方法未启动成功。也让我记住了一点,必须将/**的访问拦截放在最后一行!!

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

猜你喜欢

转载自www.cnblogs.com/adsD/p/12230903.html