Shiro学习2----spring boot整合(JdbcRealm)

1.JdbcRealm介绍

认证流程(JdbcRealm)

  • subject调用login方法,将包含用户名密码的token传递给SecurityManager
  • SecurityManager就会调用认证器(Authenticator)进行认证
  • Authenticator就将token传递给绑定的Realm,在Realm中进行用户的认证检查;如果认证通过则正常执行,不通过则抛出认证异常

2.JdbcRealm规定的表结构

  • 用户信息表:users
  • create table users(
    	id int primary key auto_increment,
    	username varchar(60) not null unique,
    	password varchar(20) not null,
    	password_salt varchar(20)
    );
    insert into users(username,password) values("zhagnsan","123456");
    insert into users(username,password) values("lisi","123456");
    insert into users(username,password) values("wangwu","123456");
    insert into users(username,password) values("zhaoliu","123456");
    insert into users(username,password) values("chenqi","123456");
  • 角色信息表:user_roles
  • create table user_roles(
    	id int primary key auto_increment,
    	username varchar(60) not null,
    	role_name varchar(100) not null
    );
    --admin系统管理员
    --cmanager库管人员
    --xmanager销售人员
    --kmanager客服人员
    --zmanager行政人员
    insert into user_roles(username,role_name) values("zhagnsan",'admin');
    insert into user_roles(username,role_name) values("lisi",'cmanager');
    insert into user_roles(username,role_name) values("wangwu",'xmanager');
    insert into user_roles(username,role_name) values("zhaoliu",'kmanager');
    insert into user_roles(username,role_name) values("chenqi",'zmanager');
  •  权限信息表:roles_permissions
create table roles_permissions(
	id int primary key auto_increment,
	role_name varchar(100) not null,
	permission varchar(100) not null
);
insert into roles_permissions(role_name,permission) values('admin','*');
insert into roles_permissions(role_name,permission) values("cmanager","sys:c:save");
insert into roles_permissions(role_name,permission) values("cmanager","sys:c:delete");
insert into roles_permissions(role_name,permission) values("cmanager","sys:c:update");
insert into roles_permissions(role_name,permission) values("cmanager","sys:c:find");
insert into roles_permissions(role_name,permission) values("xmanager","sys:c:find");
insert into roles_permissions(role_name,permission) values("xmanager","sys:x:save");
insert into roles_permissions(role_name,permission) values("xmanager","sys:x:delete");
insert into roles_permissions(role_name,permission) values("xmanager","sys:x:update");
insert into roles_permissions(role_name,permission) values("xmanager","sys:x:find");
insert into roles_permissions(role_name,permission) values("xmanager","sys:k:save");
insert into roles_permissions(role_name,permission) values("xmanager","sys:k:delete");
insert into roles_permissions(role_name,permission) values("xmanager","sys:k:update");
insert into roles_permissions(role_name,permission) values("xmanager","sys:k:find");
insert into roles_permissions(role_name,permission) values("kmanager","sys:k:find");
insert into roles_permissions(role_name,permission) values("kmanager","sys:k:update");
insert into roles_permissions(role_name,permission) values("zmanager","sys:*:find");

3.SpringBoot整合Shiro

创建spring boot应用添加依赖(同1)

配置shiro

package com.qfedu.shiro3.config;
import org.apache.shiro.realm.jdbc.JdbcRealm;
import org.apache.shiro.spring.web.ShiroFilterFactoryBean;
import org.apache.shiro.web.mgt.DefaultWebSecurityManager;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import javax.sql.DataSource;
import java.util.HashMap;
import java.util.Map;

@Configuration
public class ShiroConfig {
    //shiro方言
    @Bean
    public ShiroDialect getShiroDialect(){
        return new ShiroDialect();
    }
    @Bean
    public JdbcRealm getJdbcReam(DataSource dataSource){
        JdbcRealm jdbcRealm = new JdbcRealm();
        //JdbcRealm会自动从数据库查询用户及权限数据(数据库的表结构要符合JdbcRealm的规范)
        jdbcRealm.setDataSource(dataSource);
        //JdbcRealm默认开启认证功能,需要手动开启授权功能
        jdbcRealm.setPermissionsLookupEnabled(true);
        return jdbcRealm;
    }
    @Bean
    public DefaultWebSecurityManager getDefaultWebSecurityManager(JdbcRealm jdbcRealm){
        DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();
        securityManager.setRealm(jdbcRealm);
        return securityManager;
    }
    @Bean
    public ShiroFilterFactoryBean shiroFilter(DefaultWebSecurityManager securityManager){
        ShiroFilterFactoryBean filter = new ShiroFilterFactoryBean();
        //过滤器就是shiro进行权限校验的核心,进行认证和授权是需要SecurityManager的
        filter.setSecurityManager(securityManager);

        /*设置shiro的拦截规则
        anon    匿名用户可访问
        authc   认证用户可访问
        user    使用RemeberMe的用户可访问
        perms   对应权限可访问
        role    对应角色可访问
         */
        Map<String,String> filterMap=new HashMap<>();
        filterMap.put("/", "anon");
        filterMap.put("/login.html", "anon");
        filterMap.put("/regist.html", "anon");
        filterMap.put("/user/login", "anon");
        filterMap.put("user/regist", "anon");
        filterMap.put("/static/**", "anon");
        filterMap.put("/**", "authc");

        filter.setFilterChainDefinitionMap(filterMap);
        filter.setLoginUrl("/login.html");
        //设置未授权访问的页面路径
        filter.setUnauthorizedUrl("/login.html");
        return filter;
    }
}

4.认证页面同1

5.Shiro标签的使用

当用户认证进入到主页面后,需要显示用户信息和当前用户的权限信息,shiro就提供了一套标签用在页面来进行权限数据的呈现

shiro提供了可供jsp使用的标签以及Thymeleaf中标签

jsp页面引用

<%@ taglib prefix="shiro" uri="http://shiro.apache.org/tags"%>

Thymeleaf模板中引用

pom文件中导入thymeleaf模板对shiro标签支持的依赖

        <dependency>
            <groupId>com.github.theborakompanioni</groupId>
            <artifactId>thymeleaf-extras-shiro</artifactId>
            <version>2.1.0</version>
        </dependency>

在shiroconfig中配置shiro的方言支持

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

Thymeleaf模板中引入shiro的命名空间

<html xmlns:th="http://www.thymeleaf.org"
      xmlns:shiro="http://www.pollix.at/thymeleaf/shiro">
...
</html>

常用标签

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org"
      xmlns:shiro="http://www.pollix.at/thymeleaf/shiro">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
index
<hr/>
<!--guest判断用户是否是游客身份,是则显示此标签内容-->
<shiro:guest>
    游客:<a href="login.html">登录</a>
</shiro:guest>
<!--user判断用户是否是认证身份,是则显示-->
<shiro:user>
<!--principal获取当前登录用户名-->
    用户【<shiro:principal/>】欢迎您
<!--    hasRole获取用户角色-->
    当前用户为<shiro:hasRole name="admin">超级管理员</shiro:hasRole>
    订单管理
<!--    hasPermission当前用户有权限则显示-->
    <shiro:hasPermission name="sys:x:save"><a href="#">添加订单</a></shiro:hasPermission>
</shiro:user>
</body>
</html>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
shiro-redis-spring-boot-starter是一个用于集成Apache Shiro和Redis的Spring Boot Starter项目。Apache Shiro是一个强大而灵活的Java安全框架,用于身份验证、授权和会话管理等安全功能。而Redis是一个高性能的内存数据库,其具有快速的数据存取能力和持久化支持。 shiro-redis-spring-boot-starter提供了一种简化和快速集成Shiro和Redis的方式,使得在Spring Boot应用中实现安全功能变得更加容易。通过使用该Starter,我们可以方便地将Shiro的会话管理功能存储到Redis中,从而支持分布式环境下的会话共享和管理。 使用shiro-redis-spring-boot-starter可以带来以下好处: 1. 分布式环境的会话共享:通过将Shiro的会话数据存储到Redis中,不同的应用节点可以共享同一个会话,从而实现分布式环境下的会话管理和跨节点的身份验证和授权。 2. 高可用性和性能:Redis作为一个高性能的内存数据库,具有出色的数据读写能力和持久化支持,可以提供可靠的会话存储和高性能的数据访问能力。 3. 简化配置和集成:shiro-redis-spring-boot-starter提供了封装好的配置和集成方式,减少了我们自己实现集成的复杂性和工作量。 总结来说,shiro-redis-spring-boot-starter为我们提供了一种简化和快速集成Shiro和Redis的方式,使得在Spring Boot应用中实现安全功能变得更加容易和高效。通过它,我们可以实现分布式环境下的会话共享和管理,提供高可用性和性能的数据存取能力,同时简化了配置和集成的复杂性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

mymk01

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值