springboot与shiro整合

本文介绍如何在SpringBoot项目中集成Shiro框架进行权限管理,包括配置ShiroFilterFactoryBean和DefaultWebSecurityManager,以及自定义UserRealm实现认证和授权逻辑。

1.springboot介绍

springBoot使用习惯优于配置的理念,然项目快速运行起来,使用Spring Boot很容易创建一个独立运行的(运行jar,内嵌Servlet容器)、准生产级别的基于Spring框架的项目,使用Spring Boot可以不用或者很少使用Spring 配置

2.shiro介绍

Shiro是Apache下的一个开源项目。shiro属于轻量级框架,相对于SpringSecurity简单的多,也没有SpringSecurity那么复杂。

因为近期涉及到权限管理,所以先熟悉下shiro框架,根据自身了解,完成了一个简单demo,直接放到代码,后续会根据深入了解追加

需要两个配置文件

 

shiroConfig是配置文件:

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.LinkedHashMap;
import java.util.Map;
/**
 * shiro的配置类
 */
@Configuration
public class shiroConfig {

    //创建ShiroFilterFactoryBean

    @Bean
    public ShiroFilterFactoryBean getShiroFilterFactoryBean(@Qualifier("securityManager") DefaultWebSecurityManager securityManager){

        ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean();

        //设置安全管理器
        shiroFilterFactoryBean.setSecurityManager(securityManager);

        //添加shiro内置过滤器
        /**
         * shiro 内置过滤器  可以实现权限相关的拦截器
         *    常用的过滤器:
         *          anon:无需认(登录)可以访问
         *          authc:必须认证才能访问
         *          user:如果使用rememberMe的功能才能直接访问
         *          perms:该资源必须得到资源权限才能访问
         *          role:该资源必须得到角色权限才能访问
         */

        Map<String,String> filterMap  = new LinkedHashMap<>();
        //filterMap.put("/shiroadd","authc");

        //使用通配符 批量拦截
                //先配置无需拦截的url ,在配置拦截的url
        filterMap.put("/testThymeleaf","anon");
        filterMap.put("/*","authc");

        //修改跳转的login.jsp页面
        shiroFilterFactoryBean.setLoginUrl("/shirologin");

        shiroFilterFactoryBean.setFilterChainDefinitionMap(filterMap);

        return shiroFilterFactoryBean;
    }

    //创建DefaultWebSecurityManager

    @Bean(name = "securityManager")
    public DefaultWebSecurityManager  getDefaultWebSecurityManager(@Qualifier("UserRealm") UserRealm userRealm){

        DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();

        //关联realm

        securityManager.setRealm(userRealm);
        return securityManager;
    }

    //创建Realm

    @Bean(name="UserRealm")
    public UserRealm getRealm(){
        return new UserRealm();
    }


}

 

UserRealm配置文件

import org.apache.shiro.authc.AuthenticationException;
import org.apache.shiro.authc.AuthenticationInfo;
import org.apache.shiro.authc.AuthenticationToken;
import org.apache.shiro.authz.AuthorizationInfo;
import org.apache.shiro.realm.AuthorizingRealm;
import org.apache.shiro.subject.PrincipalCollection;

public class UserRealm extends AuthorizingRealm {

    /**
     * 执行授权逻辑
     * @param principals
     * @return
     */
    @Override
    protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {
        System.out.println("执行授权逻辑");
        return null;
    }

    /**
     * 执行认证逻辑
     * @param token
     * @return
     * @throws AuthenticationException
     */
    @Override
    protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {

        System.out.println("执行认证逻辑");

        return null;


    }
}

剩下实现类:

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

@Controller
public class ShiroController {

    @RequestMapping("/testThymeleaf")
    public String testThymeleaf(Model model){
        model.addAttribute("name","老曹");
        return "/test";
    }
    @RequestMapping("/shiroadd")
    public String add(){
        return "/user/add";
    }
    @RequestMapping("/shiroupdate")
    public String update(){
        return "/user/update";
    }
    @RequestMapping("/shirologin")
    public String login(){
        return "login";
    }
}

页面结构如下:

标题

 

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值