栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java > SpringBoot

使用shiro安全管理

SpringBoot 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

使用shiro安全管理

之前介绍了springboot使用security进行权限管理,这篇文件介绍一下springboot使用shiro进行安全管理。

简述本文的场景,本文使用springboot1.5.9+mysql+jpa+thymeleaf+shiro制作一个简单的验证,其中有2个角色,分别是admin和user,admin可以使用select和delete功能,user只能使用select功能。

新建项目,加入shiro依赖,pom文件如下:



    4.0.0

    com.dalaoyang
    springboot_shiro
    0.0.1-SNAPSHOT
    jar

    springboot_shiro
    springboot_shiro

    
 org.springframework.boot
 spring-boot-starter-parent
 1.5.9.RELEASE
  
    

    
 UTF-8
 UTF-8
 1.8
    

    
 
     org.springframework.boot
     spring-boot-starter-data-jpa
 
 
     org.springframework.boot
     spring-boot-starter-web
 

 
     org.springframework.boot
     spring-boot-devtools
     runtime
 
 
     mysql
     mysql-connector-java
     runtime
 
 
     org.springframework.boot
     spring-boot-starter-test
     test
 
 
     org.springframework.boot
     spring-boot-starter-thymeleaf
 
 
     net.sourceforge.nekohtml
     nekohtml
     1.9.15
 
 
     org.apache.shiro
     shiro-spring
     1.4.0
 
    

    
 
     
  org.springframework.boot
  spring-boot-maven-plugin
     
 
    

配置文件如下:

##端口号
server.port=8888

##数据库配置
##数据库地址
spring.datasource.url=jdbc:mysql://localhost:3306/shiro?characterEncoding=utf8&useSSL=false
##数据库用户名
spring.datasource.username=root
##数据库密码
spring.datasource.password=root
##数据库驱动
spring.datasource.driver-class-name=com.mysql.jdbc.Driver

##validate  加载hibernate时,验证创建数据库表结构
##create   每次加载hibernate,重新创建数据库表结构,这就是导致数据库表数据丢失的原因。
##create-drop 加载hibernate时创建,退出是删除表结构
##update   加载hibernate自动更新数据库结构
##validate 启动时验证表的结构,不会创建表
##none  启动时不做任何操作
spring.jpa.hibernate.ddl-auto=update

##控制台打印sql
spring.jpa.show-sql=true

# 建议在开发时关闭缓存,不然没法看到实时页面
spring.thymeleaf.cache=false
##去除thymeleaf的html严格校验
spring.thymeleaf.mode=LEGACYHTML5

创建了三个实体类,分别是
SysUser(用户表)

package com.dalaoyang.entity;

import org.hibernate.validator.constraints.NotEmpty;

import javax.persistence.*;
import java.io.Serializable;
import java.util.List;


@Entity
public class SysUser implements Serializable {

    @Id
    @GeneratedValue
    private Integer userId;
    @NotEmpty
    private String userName;
    @NotEmpty
    private String passWord;

    //多对多关系
    @ManyToMany(fetch= FetchType.EAGER)
    //急加载,加载一个实体时,定义急加载的属性会立即从数据库中加载
    //FetchType.LAZY:懒加载,加载一个实体时,定义懒加载的属性不会马上从数据库中加载
    @JoinTable(name = "SysUserRole", joinColumns = { @JoinColumn(name = "userId") },
     inverseJoinColumns ={@JoinColumn(name = "roleId") })
    private List roleList;// 一个用户具有多个角色

    public Integer getUserId() {
 return userId;
    }

    public void setUserId(Integer userId) {
 this.userId = userId;
    }

    public String getUserName() {
 return userName;
    }

    public void setUserName(String userName) {
 this.userName = userName;
    }

    public String getPassWord() {
 return passWord;
    }

    public void setPassWord(String passWord) {
 this.passWord = passWord;
    }

    public List getRoleList() {
 return roleList;
    }

    public void setRoleList(List roleList) {
 this.roleList = roleList;
    }
}

SysRole(角色表)

package com.dalaoyang.entity;

import org.hibernate.validator.constraints.NotEmpty;

import javax.persistence.*;
import java.io.Serializable;
import java.util.List;


@Entity
public class SysRole implements Serializable {

    @Id
    @GeneratedValue
    private Integer roleId;
    private String roleName;

    //多对多关系
    @ManyToMany(fetch= FetchType.EAGER)
    @JoinTable(name="SysRoleMenu",joinColumns={@JoinColumn(name="roleId")},inverseJoinColumns={@JoinColumn(name="menuId")})
    private List menuList;

    //多对多关系
    @ManyToMany
    @JoinTable(name="SysUserRole",joinColumns={@JoinColumn(name="roleId")},inverseJoinColumns={@JoinColumn(name="userId")})
    private List userList;// 一个角色对应多个用户

    public Integer getRoleId() {
 return roleId;
    }

    public void setRoleId(Integer roleId) {
 this.roleId = roleId;
    }

    public String getRoleName() {
 return roleName;
    }

    public void setRoleName(String roleName) {
 this.roleName = roleName;
    }

    public List getMenuList() {
 return menuList;
    }

    public void setMenuList(List menuList) {
 this.menuList = menuList;
    }

    public List getUserList() {
 return userList;
    }

    public void setUserList(List userList) {
 this.userList = userList;
    }
}

SysMenu(菜单表)

package com.dalaoyang.entity;

import javax.persistence.*;
import java.io.Serializable;
import java.util.List;


@Entity
public class SysMenu implements Serializable {

    @Id
    @GeneratedValue
    private Integer menuId;
    private String menuName;

    @ManyToMany
    @JoinTable(name="SysRoleMenu",joinColumns={@JoinColumn(name="menuId")},inverseJoinColumns={@JoinColumn(name="roleId")})
    private List roleList;

    public Integer getMenuId() {
 return menuId;
    }

    public void setMenuId(Integer menuId) {
 this.menuId = menuId;
    }

    public String getMenuName() {
 return menuName;
    }

    public void setMenuName(String menuName) {
 this.menuName = menuName;
    }

    public List getRoleList() {
 return roleList;
    }

    public void setRoleList(List roleList) {
 this.roleList = roleList;
    }
}

创建一个UserRepository用于查询用户信息:

package com.dalaoyang.repository;

import com.dalaoyang.entity.SysUser;
import org.springframework.data.repository.CrudRepository;


public interface UserRepository extends CrudRepository {

    SysUser findByUserName(String username);
}

创建几个前台页面进行测试,分别是:
login.html:




    
    Login


错误信息:

index.html




    
    Title


index

delete.html




    
    Title


delete

select.html




    
    Title


select

403.html




    
    Title


403

创建一个ShiroConfig,代码如下:

package com.dalaoyang.config;

import org.apache.shiro.mgt.SecurityManager;
import org.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor;
import org.apache.shiro.spring.web.ShiroFilterFactoryBean;
import org.apache.shiro.web.mgt.DefaultWebSecurityManager;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.handler.SimpleMappingExceptionResolver;

import java.util.Date;
import java.util.linkedHashMap;
import java.util.Map;
import java.util.Properties;


@Configuration
public class ShiroConfig {
    private final Logger logger = LoggerFactory.getLogger(this.getClass());

    @Bean
    public ShiroFilterFactoryBean shirFilter(SecurityManager securityManager) {
 logger.info("启动shiroFilter--时间是:" + new Date());
 ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean();
 shiroFilterFactoryBean.setSecurityManager(securityManager);
 //shiro拦截器
 Map filterChainDefinitionMap = new linkedHashMap();
 //
 //



我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号