springboot整合shiro排雷

·  阅读 385

「这是我参与11月更文挑战的第25天,活动详情查看:2021最后一次更文挑战」。

springboot整合shior初体验

什么是shiro?

​ Apache Shiro是一个强大且易用的Java安全框架,执行身份验证、授权、密码和会话管理。使用Shiro的易于理解的API,您可以快速、轻松地获得任何应用程序,从最小的移动应用程序到最大的网络和企业应用程序。

shiro框架图

​ 他有三个核心组件:Subject, SecurityManager 和 Realms. ​ Subject:即“当前操作用户”。但是,在Shiro中,Subject这一概念并不仅仅指人,也可以是第三方进程、后台帐户(Daemon Account)或其他类似事物。它仅仅意味着“当前跟软件交互的东西”。Subject代表了当前用户的安全操作,SecurityManager则管理所有用户的安全操作。 ​ SecurityManager:它是Shiro框架的核心,典型的Facade模式,Shiro通过SecurityManager来管理内部组件实例,并通过它来提供安全管理的各种服务。 ​ Realm: Realm充当了Shiro与应用安全数据间的“桥梁”或者“连接器”。也就是说,当对用户执行认证(登录)和授权(访问控制)验证时,Shiro会从应用配置的Realm中查找用户及其权限信息。 在这里插入图片描述

快速开始

  • 引入maven坐标

    <!-- https://mvnrepository.com/artifact/org.apache.shiro/shiro-spring -->
    <!--shiro整合spring的包-->
    <dependency>
        <groupId>org.apache.shiro</groupId>
        <artifactId>shiro-spring</artifactId>
        <version>1.5.3</version>
    </dependency>
    复制代码
  • 编写config文件

    package com.config;
    
    import org.apache.shiro.mgt.DefaultSecurityManager;
    
    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.HashMap;
    import java.util.Map;
    
    
    //shiro的配置类
    @Configuration
    public class ShiroConfig {
    
        //第三步:ShiroFilterFactoryBean(看源码需要传入哪些值)
        @Bean
        public ShiroFilterFactoryBean getShiroFilterFactoryBean(@Qualifier("securityManager") DefaultSecurityManager defaultSecurityManager){
            ShiroFilterFactoryBean  shiroFilterFactoryBean =new ShiroFilterFactoryBean();
            //设置安全管理器
            shiroFilterFactoryBean.setSecurityManager(defaultSecurityManager);
    
            //添加shiro的内置过滤器
               /* anno: 无需认证就可以访问
                  authc:必须认证了才可以访问
                  user: 必须拥有记住我功能才可以用
                  perms:拥有对某个资源的权限才可以访问
                  role:拥有某个角色权限才可以访问
               * */
            Map<String,String> filterMap =new HashMap<String, String>();
            shiroFilterFactoryBean.setFilterChainDefinitionMap(filterMap);
            filterMap.put("/user/add","authc");//只有认证了才可以访问/user/add页面
            filterMap.put("/user/update","authc");
            
    
            return shiroFilterFactoryBean;
        }
    
    
        //第二步获取DafaultWebSecurityManager
        @Bean(name = "securityManager")//不用默认的方法名充当名字,自己设置一个
        public DefaultSecurityManager getWebSecurityManager(@Qualifier("userRealm") UserRealm userRealm){//绑定userRealm
            DefaultWebSecurityManager webSecurityManager =new DefaultWebSecurityManager();
            //关联userRealm
            webSecurityManager.setRealm(userRealm);
            return webSecurityManager;
        }
    
        //第一步,创建realm对象,需要自定义
        @Bean
        public UserRealm userRealm(){
            return new UserRealm();
        }//自定义的UserRealm类被spring托管
    }
    
    复制代码
  • 创建测试html

    <!DOCTYPE html>
    <html lang="en" xmlns:th="http://www.thymeleaf.org">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
    
        <h1>首页</h1>
        <hr>
        <a th:href="@{/user/add}">add</a>
        <a th:href="@{/user/update}">update</a>
    
    </body>
    </html>
    复制代码

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
        add
</body>
</html>
复制代码

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    update
</body>
</html>
复制代码

开始测试

登陆界面:

登陆页面

点击图中的add按钮: 在这里插入图片描述

点击图中的update按钮: 在这里插入图片描述

均为没有权限,无法访问网站

改进思路

如果没有权限,应该跳转到登陆页面,而不是直接报404错误,所以需要添加登录页和修改部分代码

添加登录页

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <h1>登陆</h1>
    <hr>
    <form action="/login">
        <p>账号:<input type="text" name="usermame"></p>
        <p>密码:<input type="text" name="password"></p>
        <input type="submit" value="登陆">
    </form>
</body>
</html>
复制代码

修改Controller

添加了登陆的方法

package com.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
public class ShiroController {

    @RequestMapping({"/","/index"})
    public String toindex(){
        return "index";
    }

    @RequestMapping({"/user/add"})
    public String add(){
        return "user/add";
    }

    @RequestMapping({"/user/update"})
    public String update(){
        return "user/update";
    }

    @RequestMapping({"/login"})
    public String login(){
        return "user/login";
    }


}
复制代码

修改config文件

添加setLoginUrl方法

package com.config;

import org.apache.shiro.mgt.DefaultSecurityManager;

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.HashMap;
import java.util.Map;


//shiro的配置类
@Configuration
public class ShiroConfig {

    //第三步:ShiroFilterFactoryBean(看源码需要传入哪些值)
    @Bean
    public ShiroFilterFactoryBean getShiroFilterFactoryBean(@Qualifier("securityManager") DefaultSecurityManager defaultSecurityManager){
        ShiroFilterFactoryBean  shiroFilterFactoryBean =new ShiroFilterFactoryBean();
        //设置安全管理器
        shiroFilterFactoryBean.setSecurityManager(defaultSecurityManager);

        //添加shiro的内置过滤器
           /* anno: 无需认证就可以访问
              authc:必须认证了才可以访问
              user: 必须拥有记住我功能才可以用
              perms:拥有对某个资源的权限才可以访问
              role:拥有某个角色权限才可以访问
           * */
        Map<String,String> filterMap =new HashMap<String, String>();

        filterMap.put("/user/add","authc");//只有认证了才可以访问/user/add页面
        filterMap.put("/user/update","authc");
        //filterMap.put("/user/*","authc"); 支持通配符写法
        shiroFilterFactoryBean.setFilterChainDefinitionMap(filterMap);
        shiroFilterFactoryBean.setLoginUrl("/login");//设置登陆请求


        return shiroFilterFactoryBean;
    }


    //第二步获取DafaultWebSecurityManager
    @Bean(name = "securityManager")//不用默认的方法名充当名字,自己设置一个
    public DefaultSecurityManager getWebSecurityManager(@Qualifier("userRealm") UserRealm userRealm){//绑定userRealm
        DefaultWebSecurityManager webSecurityManager =new DefaultWebSecurityManager();
        //关联userRealm
        webSecurityManager.setRealm(userRealm);
        return webSecurityManager;
    }

    //第一步,创建realm对象,需要自定义
    @Bean
    public UserRealm userRealm(){
        return new UserRealm();
    }//自定义的UserRealm类被spring托管
}

复制代码

再次测试

在这里插入图片描述

点击add(update) 在这里插入图片描述

okk!!第一次使用springboot整合shiro结束了,接下来我会继续学习! 我的博客即将同步至腾讯云+社区,邀请大家一同入驻:cloud.tencent.com/developer/s…

分类:
后端
分类:
后端
收藏成功!
已添加到「」, 点击更改