springboot整合shiro(2)整合mybatis-plus+请求授权实现

环境搭建

直接参考
https://www.cnblogs.com/OfflineBoy/p/15148963.html

使用数据库代码来代替伪造数据

//认证
    @Override
    protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
        System.out.println("执行了认证方法");
        //连接真实数据库

        UsernamePasswordToken usertoken=(UsernamePasswordToken) token;
        HashMap<String,Object> map=new HashMap<>();
        map.put("name",usertoken.getUsername());
        List<User> users = userMapper.selectByMap(map);
        if(users.size()==0){
            return null;
        }
        //密码认证 安全问题 只能让shiro做 另外两个参数暂时用不到
        return new SimpleAuthenticationInfo("",users.get(0).getPassword(),"");
    }

测试即可实现与数据库交互了

请求授权实现

我们为add页面设置一个权限

@Bean
    //如果我们在某个注入点需要另一个 bean,我们需要专门指出它。我们可以通过 @Qualifier 注解来做到这一点。
    public ShiroFilterFactoryBean getShiroFilterFactoryBean(@Qualifier("getDefaultWebSecurityManager") DefaultWebSecurityManager defaultWebSecurityManager){
        ShiroFilterFactoryBean bean=new ShiroFilterFactoryBean();
        //设置安全管理器
        bean.setSecurityManager(defaultWebSecurityManager);
        //添加过滤器
        Map<String, String> filterMap = new LinkedMap();
        //perms: 拥有对某个资源的权限才能访问
        //设置一个自定义权限字符串 没有权限访问会跳到401页面
        filterMap.put("/user/add","perms[user:add]");
        filterMap.put("/user/*","authc");
        bean.setFilterChainDefinitionMap(filterMap);
        //设置登录请求
        bean.setLoginUrl("/toLogin");
        //设置未授权页面
        bean.setUnauthorizedUrl("/noauth");
        return bean;
    }

在控制类响应/noauth路径的请求

@RequestMapping("/noauth")
    @ResponseBody
    public String unauthorized(){
        return "没有权限 无法访问";
    }

现在我们登录访问add页面

将无法访问
那么如何进行授权呢?

授权的实现

在数据库上添加权限字段 这里简单代码 我们只考虑只有一种权限的情况

记得实体类添加对应属性
在授权时我们需要获得当前用户对象 那么我们就必须在登录认证时吧数据存进去

//认证
    @Override
    protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
        System.out.println("执行了认证方法");
        //连接真实数据库

        UsernamePasswordToken usertoken=(UsernamePasswordToken) token;
        HashMap<String,Object> map=new HashMap<>();
        map.put("name",usertoken.getUsername());
        List<User> users = userMapper.selectByMap(map);
        if(users.size()==0){
            return null;
        }
        //密码认证 安全问题 只能让shiro做 另外两个参数暂时用不到
        //第一个参数将user传递进去 使得授权时可以取出来
        return new SimpleAuthenticationInfo(users.get(0),users.get(0).getPassword(),"");
    }

之后我们在授权时就可以根据用户对应的权限赋权了

@Override
    protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {
        System.out.println("执行了授权方法");
        SimpleAuthorizationInfo info = new SimpleAuthorizationInfo();
        Subject subject= SecurityUtils.getSubject();
        //获得当前用户
        User currentuser = (User) subject.getPrincipal();
        //添加权限 名字对应自己设置的字符串
        info.addStringPermission(currentuser.getPerms());
        //info.addStringPermission("user:add");
        return info;
    }

到此目的达成

posted @ 2021-08-22 22:07  一个经常掉线的人  阅读(91)  评论(0)    收藏  举报