• springboot整合shiro步骤


    一:springboot快速入门:

    1.建立Maven项目,导入springboot父工程

    <!-- 继承springboot默认父工程 -->
    <parent>
      	<groupId>org.springframework.boot</groupId>
    	<artifactId>spring-boot-starter-parent</artifactId>
      	<version>2.1.2.RELEASE</version>
    </parent> 
    

    2.导入web支持

    <!-- 导入web场景支持 -->
    <dependency>
      	<groupId>org.springframework.boot</groupId>
      	<artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    

    3.编写测试controller类

    4.编写springboot启动类

    @SpringBootApplication
    public class Application {
    	public static void main(String[] args) {
    		SpringApplication.run(Application.class, args);
    	}
    }
    

    5.导入thymeleaf页面模块

    1.引入thymeleaf依赖

    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-thymeleaf</artifactId>
    </dependency>
    

    2.建立test.html页面

    在src/main/resource/创建templates目录,再创建test.html页面

    再thymeleaf3.0以前对页面标签语法要求比较严格,开始标签必须有对应的结束标签

    二:springboot与shiro整合

    1.shiro核心api

    subject:用户主体(把操作交给securityManager)
    securityManager:安全管理器(关联realm)
    reaml:shiro连接数据的桥梁	
    

    2.springboot整合shiro

    2.1导如shiro与spring整合依赖

    <dependency>
      <groupId>org.apache.shiro</groupId>
      <artifactId>shiro-spring</artifactId>
      <version>1.4.0</version>
    </dependency>
    

    2.2自定义realm类,继承AuthorizingRealm

    2.3编写shiro配置类

    创建ShiroFilterFactoryBean

    创建DefaultWebSecurityManager

    创建Realm

    3.使用shiro内置过滤器实现页面拦截

    在ShiroFilterFactoryBean里添加shiro内置过滤器

    shiro内置过滤器,可以实现权限相关的拦截器

    //常用的过滤器:
    	//anon:无需认证(登陆)可以访问
    	//authc:必须认证才可以访问
    	//user:如果使用rememberMe的功能可以直接访问
    	//perms:该资源必须得到资源权限才可以访问
    	//role:该资源必须得到角色权限才可以访问
    Map<String,String> filterMap = new LinkedHashMap<String,String>();
    	filterMap.put("/testThymeleaf", "anon");	//放行
    	filterMap.put("/*", "authc");	//拦截
    	//修改跳转到的登陆页面,默认是跳到login.jsp
    	shiroFilterFactoryBean.setLoginUrl("/tologin");
    	shiroFilterFactoryBean.setFilterChainDefinitionMap(filterMap);
    

    4.实现用户认证(登陆)操作

    4.1编写登陆页面

    4.2控制层中使用shiro编写认证操作

    //获取subject
        Subject subject = SecurityUtils.getSubject();
    //封装用户数据
        UsernamePasswordToken token = new UsernamePasswordToken(username, password);
    //执行登陆方法
        subject.login(token);
    

    4.3编写realm的判断逻辑

    //1.判断用户名
    UsernamePasswordToken token = (UsernamePasswordToken)arg0;
    if(!token.getUsername().equals(username)) {
    	//用户名不存在
    	return null;	//shiro底层会抛出UnknownAccountException
    }
    //2.判断密码
    return new SimpleAuthenticationInfo("", password, "");
    

    5.整合mybatis实现认证登陆

    5.1导入mybatis相关依赖包

    <!-- 数据库连接池 -->
    <dependency>
      <groupId>com.alibaba</groupId>
      <artifactId>druid</artifactId>
      <version>1.0.9</version>
    </dependency>
    <!-- mysql数据库 -->
    <dependency>
      <groupId>mysql</groupId>
      <artifactId>mysql-connector-java</artifactId>
      <version>5.1.44</version>
    </dependency>
    <!-- springboot的mybatis启动器 -->
    <dependency>
      <groupId>org.mybatis.spring.boot</groupId>
      <artifactId>mybatis-spring-boot-starter</artifactId>
      <version>1.1.1</version>
    </dependency>
    

    5.2配置application.properties

    位置在:src/main/resources目录下:配置jdbc,连接池,扫描包

    5.3编写User实体

    5.4编写UserMapper接口

    5.5编写UserMapper.xml映射文件

    5.6编写业务接口和实现

    接口/实现

    5.7添加@MapperScan注解

    //在spingboot启动程序类上加上:
    @MapperScan("com.xtkj.mapper")
    

    5.8修改UserRealm

    User user = userService.findByAccount(token.getUsername());
    if(null==user) {
    	//用户名不存在
    	return null;	//shiro底层会抛出UnknownAccountException
    }
    

    三:springboot与shiro整合实现用户授权

    1.使用shiro内置过滤器拦截资源(ShiroConfig)

    	//授权过滤器(需要放在下面认证语句之前)
    	//当授权拦截后,shiro会自动跳转到未授权页面
    	filterMap.put("/add", "perms[user:add]");
    	filterMap.put("/update", "perms[user:update]");
    	//设置未授权页面
    	shiroFilterFactoryBean.setUnauthorizedUrl("/unauth");
    

    2.完成shiro的资源授权(UserRealm)

    	//给资源进行授权
    	SimpleAuthorizationInfo info = new SimpleAuthorizationInfo();
    	//到数据库查询当前登陆用户的授权字符串
    	//获取当前登陆用户
    	Subject subject = SecurityUtils.getSubject();
    	User user = (User)subject.getPrincipal();
    	User dbuser = userService.findById(user.getId());
    	//根据角色来进行授权
    	info.addStringPermission(dbuser.getPerms());
    

    四:thymeleaf和shiro标签整合使用

    1.导入thymeleaf扩展坐标

    <!-- thymeleaf对shiro的扩展坐标 -->
    <dependency> 
      <groupId>com.github.theborakompanioni</groupId> 
      <artifactId>thymeleaf-extras-shiro</artifactId> 
      <version>2.0.0</version> 
    </dependency>
    

    2.配置shiroDialect

    @Bean
    public ShiroDialect getShiroDialect() {
      return new ShiroDialect();
    }
    

    3.在html页面上使用shiro标签

    <div shiro:hasPermission="user:add">
    	进入用户添加页面:<a th:href="@{/add}">用户添加</a><br>
    </div>
    <div shiro:hasPermission="user:update">
    	进入用户修改页面:<a th:href="@{/update}">用户修改</a><br>
    </div>
  • 相关阅读:
    你的MongoDB Redis设置用户名密码了吗?看看shodan这款邪恶的搜索引擎吧!~
    聊聊数据库(MySql)连接吧,你真的清楚吗?
    .net Mongo Driver 1.0与2.0的对比与2.0的优化
    浅谈 JavaScript new 执行过程及function原理
    Jquery源码分析与简单模拟实现
    使用HttpWebRequest模拟登陆阿里巴巴(alibaba、httpwebrequest、login)
    Url以.(点)结尾,在使用httpwebrequest读取的时候,微软会有一个bug……
    VS超强调试技巧--忍不住想赞一下
    ClickOnce部署疑难杂症:更新时部署与应用程序标识不一致问题。要安装此应用程序,请修改此文件的清单版本或卸载之前存在的应用程序。
    MAC地址的介绍(单播、广播、组播、数据收发)
  • 原文地址:https://www.cnblogs.com/itzlg/p/10699527.html
Copyright © 2020-2023  润新知