SpringBoot和shiro整合项目实战五 最后一章(图解超详细)

承接上一篇博客:https://blog.csdn.net/qq_41115379/article/details/113106449
这是下一篇博客:https://blog.csdn.net/qq_41115379/article/details/113106449
首先要说的是,这个项目实战是参考自黑马,可以去对应视频看一看:https://www.bilibili.com/video/BV1ct411x7CN
在这里插入图片描述
最后一篇主要的是实现shiro整合用户授权
首先在shiroConfig这边进行小小的改动
在filterMap这边加入这个

filterMap.put("/add","perms[user:add]");

这边需要先用正确的账号密码登录
在这里插入图片描述
也就是未授权的错误

然后继续修改
shiroConfig

package com.example.shiro;

import org.apache.shiro.spring.web.ShiroFilterFactoryBean;
import org.apache.shiro.web.mgt.DefaultWebSecurityManager;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.util.LinkedHashMap;
import java.util.Map;

@Configuration
public class ShiroConfig {
    
    
    /**
     * 创建Realm bean会让方法返回的对象放入到spring的环境,以便使用
     */
    @Bean(name = "userRealm")
    public UserRealm getRealm(){
    
    
        return new UserRealm();
    }
    /**
     * 创建DefaultWebSecurityManager
     */
    //这里的传参有点特殊可以调用一个注解,这里有个细节,想看看注解区不区分大小写
    //实测,会报错。。。所以是区分大小写的
    // @Qualifier 注释指定注入 Bean 的名称,是用来消除歧义的
    //这里也要有Bean
    @Bean(name = "defaultWebSecurityManager")
    public DefaultWebSecurityManager getDefaultWebSecurityManager(@Qualifier("userRealm") UserRealm userRealm){
    
    
        DefaultWebSecurityManager defaultWebSecurityManager=new DefaultWebSecurityManager();
        //关联realm,并且这个是需要传参的
        defaultWebSecurityManager.setRealm(userRealm);
        return defaultWebSecurityManager;
        //感觉和直接return一个 new的一样吧 之所以不直接return是因为,会调用一个
        //关联realm的方法
    }
    /**
     * 创建shiroFilterFactoryBean
     */
    //也是需要注解和参数的
    //这里也是需要bean注解的
    @Bean
    public ShiroFilterFactoryBean getShiroFilterFactoryBean(@Qualifier("defaultWebSecurityManager") DefaultWebSecurityManager defaultWebSecurityManager){
    
    
        ShiroFilterFactoryBean shiroFilterFactoryBean=new ShiroFilterFactoryBean();
        //设置一个安全管理器来关联SecurityManager
        shiroFilterFactoryBean.setSecurityManager(defaultWebSecurityManager);

        //添加shiro内置过滤器
        //先创建一个Map集合
        Map<String,String> filterMap=new LinkedHashMap<String,String>();
        //然后往里面添加东西



        filterMap.put("/add","authc");
        filterMap.put("/update","authc");
        //也可以改成这样 但是是因为选择了templates下的所有,但是testThymeleaf 是不需要的,所有是需要将testThymeleaf改成anno
       /* filterMap.put("/testThymeleaf","anon");
        filterMap.put("/*","authc");
*/
        //授权过滤器 这边使用的是perms,也就是该资源必须得到资源授权才可以访问
        //所以当未授权的时候shiro就会自动跳转到一个未授权的页面
        filterMap.put("/add","perms[user:add]");

        /**
         * 修改调整的登录页面
         */
        //然后这个跳转的页面,就是需要control来进行自动装入这个页面
        shiroFilterFactoryBean.setLoginUrl("/login");

        //所以要设置未授权的页面
        shiroFilterFactoryBean.setUnauthorizedUrl("/unAuth");
        shiroFilterFactoryBean.setFilterChainDefinitionMap(filterMap);
        return shiroFilterFactoryBean;
    }



}

在controller加入授权页面

 //这里增加一个授权页面
    @RequestMapping("/unAuth")
    public String unAuth(){
    
    
        System.out.println("UserController.unAuth()");
        //同理返回路径
        return "unAuth";
    }

并在templates下新建一个
unAuth.html文件

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>未授权提示页面</title>
</head>
<body>
你未授权
</body>
</html>

运行结果如下
在这里插入图片描述
修改一下UserRealm就行

  @Override
    protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {
    
    
        System.out.println("执行授权逻辑");
        //再访问了之后就可以进行修改
        //给资源进行授权
        SimpleAuthorizationInfo info=new SimpleAuthorizationInfo();
        //添加资源的授权字符串,要和授权那边的字符串一致
        info.addStringPermission("user:add");
        return  info;
    }

这样子运行就没问题了
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_41115379/article/details/113114436