开发|ShiroConfig实现基础拦截

时间:2022-07-28
本文章向大家介绍开发|ShiroConfig实现基础拦截,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

1 Shiro核心API以及关系

首先了解一点基本的内容:

Subjrct:用户主体(登录,注销,判断授权等等一些的方法)(把操作交给SecurityManager)

SecurityManager:安全管理器(关联Realm)

Realm:Shiro连接数据的桥梁(操作查询数据库或配置文件,获取用户的信息)

2 导入对应依赖

在编写代码前,应先将所需要的依赖进行导入,这里放了shiro与spring整合依赖,其他依赖按需要进行导入。


<!--  shiro与spring整合依赖  -->

<dependency>

      <groupId>org.apache.shiro</groupId>

      <artifactId>shiro-spring</artifactId>

      <version>1.4.0</version>

</dependency>

3 新建ShiroConfig类

首先就是新建ShiroConfig配置类,并写上对应注解@Configuration

图3.1

然后是在这个配置类里需要创建三个Bean,分别是

1.ShiroFilterFactoryBean;

2.DefaultWebSecurityManager;3.Realm。

4 实现步骤

4.1

首先是Realm,先创建一个自定义的UserRealm类,在这个类是放编写一些查询的方式方法、认证授权的一些逻辑。这个类需要先继承AuthorizingRealm,会分别实现两个方法,如下(还没写认证等方法):


public  class UserRealm extends AuthorizingRealm {

    //执行一些授权逻辑

    @Override

    protected AuthorizationInfo  doGetAuthorizationInfo(PrincipalCollection principalCollection) {

        System.out.println("执行授权逻辑");

        return null;

    }

   

    //执行一些认证逻辑

    @Override

    protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken  authenticationToken) throws AuthenticationException {

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

        return null;

    }

}

4.2

然后回到Config类,写Realm Bean(不要忘记写注解!):


//3.Realm  Bean

    @Bean(name = "Realm")

    public UserRealm getRealm() {

        return new UserRealm();

    }

4.3

接着写DefaultWebSecurityManager,用@Qualifier("Realm")将userRealm传进来:


//2.DefaultWebSecurityManager

    @Bean(name =  "DefaultWebSecurityManager")

    public DefaultWebSecurityManager  getDefaultWebSecurityManager(@Qualifier("Realm")UserRealm  userRealm) {

        DefaultWebSecurityManager  securityManager = new DefaultWebSecurityManager();

        //关联realm

        securityManager.setRealm(userRealm);

        return securityManager;

    }

4.4

最后是ShiroFilterFactoryBean,在这里面就可以写需要拦截过滤或放行的页面接口,也可以修改在页面被拦截后需要跳转到的页面接口(默认页面为login.jsp):


//1.ShiroFilterFactoryBean

    @Bean

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

        ShiroFilterFactoryBean  shiroFilterFactoryBean = new ShiroFilterFactoryBean();

 

        //设置安全管理器,关联一个securityManager,也是通过Qualifier注解拿到

        shiroFilterFactoryBean.setSecurityManager(securityManager);

 

        //添加Shiro过滤拦截器

        /**

         *常用过滤器

         *   anon:无需登录(认证)可以访问

         *   authc:必须认证才可以访问

         *   user:如果使用remeberMe的功能,可以直接访问

         *   perms:该资源必须得到资源权限才可以访问

         *   role:该资源必须得到角色权限才可以访问

         */

 

        Map<String, String> filterMap =  new LinkedHashMap<String, String>();

 

        //需要过滤的东西,不拦截的放前面

        filterMap.put("/add",  "authc");

        filterMap.put("/delete",  "authc");

 

        //修改拦截后跳转的页面

         shiroFilterFactoryBean.setLoginUrl("/login");

 

       shiroFilterFactoryBean.setFilterChainDefinitionMap(filterMap);

 

        return shiroFilterFactoryBean;

    }

5 注意点

需要注意,容易出错的地方:

1.依赖的版本,可能程序运行出错由于版本冲突。

2.不要忘记注解的书写,如上面的@Configuration、@Bean等。

3.在最后写过滤器时,其中的接口不要留空,否则会找不到之类的报错。

4.写过滤时,放行的写在前面,拦截的写在后面。

END

主 编 | 张祯悦

责 编 | yellow