springBoot整合Shiro+mybatis实现登录认证和权限控制

springBoot整合Shiro+mybatis实现登录认证和权限控制

简介

**

Apache Shiro是一个功能强大、灵活的,开源的安全框架。它可以干净利落地处理身份验证、授权、企业会话管理和加密。
在这里插入图片描述
上图是 Shiro 的基本架构

Authentication(认证)

有时被称为“登录”,用来证明用户是用户他们自己本人

Authorization(授权)

访问控制的过程,即确定“谁”访问“什么”

Session Management(会话管理)

管理用户特定的会话,在 Shiro 里面可以发现所有的用户的会话信息都会由 Shiro 来进行控制

Cryptography(加密)

在对数据源使用加密算法加密的同时,保证易于使用

这里只给出主要的 Shiro 依赖 其它的依赖请随心导入

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

配置

以下是我数据库的基本配置 (请结合你自己使用的JDBC进行数据库配置 )

spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/im-muxin?useUnicode=true&characterEncoding=utf-8&useSSL=false
spring.datasource.username=root
spring.datasource.password=123456
spring.datasource.type=com.zaxxer.hikari.HikariDataSource

下面给出必须的两张表:用户基本信息表和权限表

直接看我的表实体类吧 (下面是我使用mybatis自动生成的实体类 如果mybatis自动生成代码不知道的请自行百度)
u_role:权限表实体类(get和set方法我没有复制进来请自行实现建议使用@Data注解实现简单方便)

@Table(name = "u_role")
public class URole {
    @Id
    private Integer id;

    @Column(name = "user_id")
    private String userId;

    private String role;

    @Column(name = "create_time")
    private Date createTime;

    @Column(name = "update_time")
    private Date updateTime;

}

users:用户表实体类

public class Users {
    /**
     * 自增主键
     */
    @Id
    private Integer id;

    /**
     * 用户账号
     */
    private String username;

    /**
     * 账号密码
     */
    private String password;
}

下面进行shiro代码
首先建立 Realm 类,继承自 AuthorizingRealm,自定义我们自己的授权和认证的方法。Realm 是可以访问特定于应用程序的安全性数据(如用户,角色和权限)的组件。

MyRealm.java

package com.im.immuxin.shiro;


import com.im.immuxin.pojo.URole;
import com.im.immuxin.pojo.Users;
import com.im.immuxin.server.URoleServer;
import com.im.immuxin.server.UsersServer;
import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authc.*;
import org.apache.shiro.authz.AuthorizationInfo;
import org.apache.shiro.authz.SimpleAuthorizationInfo;
import org.apache.shiro.realm.AuthorizingRealm;
import org.apache.shiro.subject.PrincipalCollection;
import org.springframework.beans.factory.annotation.Autowired;

import java.util.List;

public class MyRealm extends AuthorizingRealm {

    @Autowired
    private UsersServer userService;

    @Autowired
    private URoleServer uRoleServer;

    //授权
    @Override
    protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {
        //从凭证中获得用户名
        String username = (String) SecurityUtils.getSubject().getPrincipal();
        //根据用户名查询用户对象
        Users user = userService.getUser(username);
        //查询用户拥有的角色
        List<URole> list = uRoleServer.findByUserId(user.getId());
        SimpleAuthorizationInfo info = new SimpleAuthorizationInfo();
        for (URole role : list) {
        //赋予用户角色
            info.addStringPermission(role.getRole());
        }
        return info;
    }

    //认证
    @Override
    protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken) throws AuthenticationException {

        //获得当前用户的用户名
        String username = (String) authenticationToken.getPrincipal();

        //从数据库中根据用户名查找用户
        Users user = userService.getUser(username);
        if (user == null) {
            throw new UnknownAccountException(
                    "没有在本系统中找到对应的用户信息。");
        }

        SimpleAuthenticationInfo info = new SimpleAuthenticationInfo(user.getUsername(), user.getPassword(), getName());
        return info;
    }


}

Shiro 配置类

ShiroConfig.java

package com.im.immuxin.shiro;



import org.apache.shiro.mgt.SecurityManager;
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 java.util.LinkedHashMap;
import java.util.Map;

@Configuration
public class ShiroConfig {

    @Bean
    public ShiroFilterFactoryBean shiroFilterFactoryBean(SecurityManager securityManager) {
        ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean();
        shiroFilterFactoryBean.setSecurityManager(securityManager);
        Map<String, String> filterChainDefinitionMap = new LinkedHashMap<String, String>();
        //以下是过滤链,按顺序过滤,所以/**需要放最后
        //开放的静态资源 放开swagger-ui 不用登录即可访问
        filterChainDefinitionMap.put("/favicon.ico", "anon");//网站图标
        filterChainDefinitionMap.put("/u/registOrLogin","anon");
        filterChainDefinitionMap.put("/swagger-ui.html","anon");
        filterChainDefinitionMap.put("/swagger-resources/**","anon");
        filterChainDefinitionMap.put("/v2/api-docs/**","anon");
        filterChainDefinitionMap.put("/webjars/springfox-swagger-ui/**","anon");
        filterChainDefinitionMap.put("/**", "authc");
        shiroFilterFactoryBean.setFilterChainDefinitionMap(filterChainDefinitionMap);
        return shiroFilterFactoryBean;
    }

    @Bean
    public DefaultWebSecurityManager  securityManager() {
        DefaultWebSecurityManager defaultWebSecurityManager = new DefaultWebSecurityManager(myRealm());
        return defaultWebSecurityManager;
    }


    @Bean
    public MyRealm myRealm() {
        MyRealm myRealm = new MyRealm();
        return myRealm;
    }

 /**
     *  开启shiro aop注解支持.
     *  使用代理方式;所以需要开启代码支持;
     * @param securityManager
     * @return
     */
    @Bean
    public AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor(SecurityManager securityManager){
        AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor = new AuthorizationAttributeSourceAdvisor();
        authorizationAttributeSourceAdvisor.setSecurityManager(securityManager);
        return authorizationAttributeSourceAdvisor;
    }

//    @Bean
//    @ConditionalOnMissingBean
//    public DefaultAdvisorAutoProxyCreator defaultAdvisorAutoProxyCreator() {
//        DefaultAdvisorAutoProxyCreator defaultAAP = new DefaultAdvisorAutoProxyCreator();
//        defaultAAP.setProxyTargetClass(true);
//        return defaultAAP;
//    }
}

实现以上的即可实现登录拦截了 有些人可以会报如下常见错误

The bean 'securityManager', defined in class path resource [org/apache/shiro

报找不到bean 这个是因为有些bean名字重复了 导致报这个错误
但它也给出了解决方案 具体图片找不到了
如果报上面的错误可以直接在配置文件(application.properties)里面添加下面这行代码:
这的意思是允许加载同名的

spring.main.allow-bean-definition-overriding=true

最后 最重要的权限控制了 期数就是一个注解
![在这里插入图片描述](https://img-blog.csdnimg.cn/20191225100209558.png?x-oss-process=image/watermark,type3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L20wXzQ2MDg2MTY1,size_16,color_FFFFFF,t_70
在这里插入图片描述

使用 @RequiresPermissions 这个注解即可实现权限验证

登录如果是用shiro自带的login也可以 如果是要在自己的登录接口里面的话 需要调用shiro的方法
如下图:
在这里插入图片描述
下图是图片 可以直接使用 不用Server层
在这里插入图片描述
登录和退出都是使用的shiro里面的方法

好了以上就是shiro基本的应用了

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值