shiro简介及与SpringBoot整合---自我总结

一、Shior简介:

重点:java安全框架、认证、授权

百度百科介绍:Apache Shiro是一个强大且易用的Java安全框架,执行身份验证、授权、密码和会话管理。使用Shiro的易于理解的API,您可以快速、轻松地获得任何应用程序,从最小的移动应用程序到最大的网络和企业应用程序。

主要功能:

三个核心组件:Subject, SecurityManager 和 Realms.

Subject:即“当前操作用户”。但是,在Shiro中,Subject这一概念并不仅仅指人,也可以是第三方进程、后台帐户(Daemon Account)或其他类似事物。它仅仅意味着“当前跟软件交互的东西”。

Subject代表了当前用户的安全操作,SecurityManager则管理所有用户的安全操作。

SecurityManager:它是Shiro框架的核心,典型的Facade模式,Shiro通过SecurityManager来管理内部组件实例,并通过它来提供安全管理的各种服务。

Realm: Realm充当了Shiro与应用安全数据间的“桥梁”或者“连接器”。也就是说,当对用户执行认证(登录)和授权(访问控制)验证时,Shiro会从应用配置的Realm中查找用户及其权限信息。

二、Spring boot 整合shior

1.雷打不动先添加jar包依赖,

        <!-- shiro 依赖-->
        <dependency>
            <groupId>org.apache.shiro</groupId>
            <artifactId>shiro-spring-boot-starter</artifactId>
            <version>1.9.1</version>
        </dependency>

        <!-- thymeleaf 整合 shior-->
        <dependency>
            <groupId>com.github.theborakompanioni</groupId>
            <artifactId>thymeleaf-extras-shiro</artifactId>
            <version>2.0.0</version>
        </dependency>

2.自定义realm

         当密码验证通过后,就到了我们的自定义realm,在我们自定义realm中实现了AuthorizingRealm接口,将其方法进行重写,将各种权限对用户进行授权,同时对用户身份进行验证,代码如下,每一行代码具体含义十分详细了。

public class UserRealm extends AuthorizingRealm {
    @Resource
    IUserService userService;
    //授权
    @Override
    protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {
        System.out.println("========授权方法正在执行==========");
        //principalCollection 可以获取整体用户数据的
        //SimpleAuthorizationInfo 权限初始化
        SimpleAuthorizationInfo info = new SimpleAuthorizationInfo();
        //拿到这个登录的对象
        Subject subject = SecurityUtils.getSubject();
        User currentUser= (User) subject.getPrincipal();//拿到User对象
        int st=currentUser.getSt();
        //设置当前用户的权限
        info.addStringPermission(currentUser.getSt()+"");
        if(st==1){
            System.out.println("用户设置权限");
            //info 添加了用户的add权限
            info.addStringPermission("index:add");
            info.addStringPermission("index:select");
        }
        return info;
    }

    //认证
    @Override
    protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
        UsernamePasswordToken userToken=(UsernamePasswordToken)token;
        String password=new String((char[])token.getCredentials());
        //从user中获取数据库用户信息
        User user=userService.login(userToken.getUsername(),password);
        System.out.println(user);
        if (user!=null){
            System.out.println("用户正确");
            Subject currentSubject = SecurityUtils.getSubject();
            //shiro的对象存入我们的用户
            Session session = currentSubject.getSession();
            session.setAttribute("loginUser",user);
            String name=user.getName();
            System.out.println(name);
            return new SimpleAuthenticationInfo(user,user.getPassword(),"用户你好!");
        } else {
         return null;
        }
    }
}

3.实现shiroConfig配置类

配置了三个核心组件:Subject, SecurityManager 和 Realms.

@Configuration
//添加配置类注解 
public class ShiroConfig {


    //DefaultWebSecurityManager:2  配置securityManager安全管理器,主要起到一个桥梁作用。
    @Bean(name = "securityManager1")
    public DefaultWebSecurityManager getDefaultWebSecurityManager(@Qualifier("userRealm") UserRealm userRealm){
        DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();
        //关联UserRealm
        securityManager.setRealm(userRealm);
        return securityManager;
    }

    //ShiroFilterFactoryBean:3  进行全局配置,Filter工厂。
    // 设置对应的过滤条件和跳转条件,有自定义的过滤器,有shiro认证成功后,失败后,退出后等跳转的页面,
    // 有静态页面等内容的权限范围。
    @Bean(name = "shiroFilterFactoryBean")
    public ShiroFilterFactoryBean  getShiroFilterFactoryBean(@Qualifier("securityManager1") DefaultWebSecurityManager defaultWebSecurityManager){
        System.out.println("正在执行。。getShiroFilterFactoryBean。。");
        ShiroFilterFactoryBean bean = new ShiroFilterFactoryBean();
        // 设置安全管理器
        bean.setSecurityManager(defaultWebSecurityManager);
        //添加Shiro内置过滤器
        /*
         * anon:无需认证就可以访问
         * authc:必须认证了才能访问
         * user:必须拥有 记住我 功能才能用
         * perms:拥有对某个资源的权限才能访问
         * role:拥有某个角色权限才能访问
         * */
        //登录拦截
        Map<String, String> filterMap = new LinkedHashMap<>();
        //授权
        //filterMap.put("/user/add","perms[user:add]");
        // 开放静态资源文件
        filterMap.put("/css/**", "anon");
        filterMap.put("/img/**", "anon");
        filterMap.put("/js/**", "anon");
        filterMap.put("/login.jsp", "anon");
        filterMap.put("/student/showall", "perms[index:select]");
        filterMap.put("/scoreshow", "perms[index:select]");

        bean.setFilterChainDefinitionMap(filterMap);
        //未授权页面
        //bean.setUnauthorizedUrl("/noauth");
        //设置登录的请求
        bean.setLoginUrl("/login");
        return bean;
    }
    //创建 realm 对象,需要自定义类:1
    @Bean
    public UserRealm userRealm(){
        return new UserRealm();
    }
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值