shiro拦截认证的全过程记录

本文将详细讲解如何使用Shiro进行拦截认证的全过程。针对Shiro拦截认证的过程,主要是包括Shiro拦截器、Shiro过滤器和Shiro Realm三个部分。我们将逐步介绍这三个部分的功能和作用,并且提供两个示例,更好地帮助您理解Shiro的使用。

Shiro拦截器

Shiro拦截器的主要作用是在请求到达目标方法之前,拦截该请求,进行用户身份认证、权限控制等操作。Shiro提供了一系列预定义的拦截器,也可以根据需要自定义拦截器。在Shiro中,拦截器是通过FilterChain进行管理的。

示例一:自定义拦截器

public class CustomAuthInterceptor extends HandlerInterceptorAdapter {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        //通过request、response对象判断用户身份
        if (request.getUserPrincipal() == null) {
            //进行身份验证失败处理
            response.sendRedirect("/login");
            return false;//不再继续执行目标方法
        }
        return true;//继续执行目标方法
    }
}

通过继承HandlerInterceptorAdapter抽象类,我们可以自定义拦截器,并且在preHandle方法中实现对用户身份的认证,如果认证失败则重定向到/login页面。

Shiro过滤器

过滤器是Shiro中拦截器的具体实现,通过对URL、IP地址、用户名等进行过滤,保护应用程序的安全。Shiro提供了一系列预定义的过滤器,也可以根据需要自定义过滤器。在Shiro中,过滤器是通过FilterChainDefinitionMap进行管理的。

示例二:使用Shiro自带过滤器

在Shiro中,有各种各样的过滤器,可以完成不同的任务,如登陆认证、授权、记住我等。下面是一个简单的FilterChainDefinitionMap配置:

<bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean">
    ...
    <property name="filterChainDefinitionMap">
        <map>
            <entry key="/admin/**" value="authc,roles[admin]"/>
            <entry key="/user/**" value="authc,roles[user]"/>
            <entry key="/login" value="authc"/>
            <entry key="/logout" value="logout"/>
        </map>
    </property>
</bean>

上面示例中,我们对URL进行了分类,设置了不同的访问规则,如访问/admin/下的页面必须是已经通过admin身份认证的用户才能访问。

Shiro Realm

Shiro Realm是负责对用户身份信息进行管理和认证的组件,它从数据源中获取用户信息,并且提供身份认证、授权、加密等功能。在Shiro中,Realm是一个接口,需要进行自定义。

示例三:自定义Realm

public class MyRealm extends AuthorizingRealm {
    private UserService userService;

    public void setUserService(UserService userService) {
        this.userService = userService;
    }

    protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {
        //获取当前用户信息,如用户角色、权限等
        String username = (String) principals.fromRealm(getName()).iterator().next();
        User user = userService.getUserByName(username);
        SimpleAuthorizationInfo authInfo = new SimpleAuthorizationInfo();
        for (Role role : user.getRoles()) {
            authInfo.addRole(role.getName());
            for (Permission perm : role.getPermissions()) {
                authInfo.addStringPermission(perm.getName());
            }
        }
        return authInfo;
    }

    protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
        UsernamePasswordToken userToken = (UsernamePasswordToken) token;
        User user = userService.getUserByName(userToken.getUsername());
        if(user == null) {
            throw new UnknownAccountException("无此用户");
        }
        return new SimpleAuthenticationInfo(user.getUsername(), user.getPassword(), getName());
    }
}

通过实现AuthorizingRealm抽象类,我们可以自定义Realm,并且在doGetAuthorizationInfo方法中获取当前用户的角色和权限信息,在doGetAuthenticationInfo方法中对用户身份信息进行认证。

上述内容就是Shiro拦截认证的全过程记录的完整攻略了,希望对您有所帮助。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:shiro拦截认证的全过程记录 - Python技术站

(0)
上一篇 2023年6月27日
下一篇 2023年6月27日

相关文章

  • 在iphone上打开app时跳出不受信任的开发者怎么回事?如何解决?

    在iPhone上,如果尝试打开一个未经过苹果官方认证的应用程序时,有时会弹出一个提示框,提示框中标注为“不受信任的开发者”,并且无法继续打开应用。这是因为iOS系统在安全方面有一些限制,只允许通过App Store下载的应用程序或者已受过信任的开发者签名的应用程序。 要解决这个问题,需要有两种方法: 1. 通过信任开发者 步骤: 在弹出提示框的时候,点击“取…

    other 2023年6月26日
    00
  • Java Bean的作用域,生命周期和注解

    Java Bean是一种可重用的Java组件,通过封装功能独立性强的成员变量和相应的get/set方法,使之成为一种与平台无关的可重用组件。Java Bean的作用域、生命周期和注解是Java Bean的三个重要方面,下面我们逐一讲解。 Java Bean的作用域 Java Bean有四种作用域:请求(request)、会话(session)、应用程序(ap…

    other 2023年6月27日
    00
  • postgresql 实现字符串分割字段转列表查询

    首先,在 PostgreSQL 中实现字符串分割字段转列表查询,需要用到内置函数 string_to_array() 和 unnest()。 string_to_array() 函数可以将一个字符串按照指定的分隔符分隔成一个数组,其语法如下: string_to_array(string text, delimiter text) RETURNS text[…

    other 2023年6月25日
    00
  • 鸿蒙开源第三方组件之连续滚动图像组件功能

    下面是“鸿蒙开源第三方组件之连续滚动图像组件功能”的完整攻略: 一、介绍 鸿蒙开源第三方组件中,已经有了一些非常实用的图像组件,但是在实际的开发中,我们有时需要实现一些连续滚动的图像展示,这时就可以使用鸿蒙开源第三方组件之连续滚动图像组件。 该组件可以自动进行图像轮播,也可以手动进行停止、开始等操作。 二、使用方式 2.1 下载组件 首先需要在代码中引入该组…

    other 2023年6月27日
    00
  • php递归实现无限分类的方法

    PHP递归实现无限分类的方法 在实现一个无限分类的功能时,我们需要用到递归的方法。本文将详细讲解如何用PHP来实现无限分类的功能。 数据库表结构 首先,我们需要在数据库中建立符合我们需要的数据表结构。这是一个常见的无限分类数据表结构: CREATE TABLE `categories` ( `id` int(11) NOT NULL AUTO_INCREME…

    other 2023年6月27日
    00
  • Android组件化原理详细介绍

    Android组件化原理详细介绍 什么是Android组件化? Android组件化是一种软件架构模式,旨在将一个大型的Android应用程序拆分为多个独立的组件,每个组件都具有自己的功能和职责。这种模式可以提高代码的可维护性、可测试性和可扩展性,同时也方便团队协作和模块化开发。 组件化的原理 组件化的原理主要包括以下几个方面: 1. 模块化设计 在组件化中…

    other 2023年8月3日
    00
  • tensorflow在各操作系统下各版本对应关系

    下面是关于“TensorFlow在各操作系统下各版本对应关系”的完整攻略: 1. TensorFlow版本说明 TensorFlow是一个开源的人工智能框架,由Google开发。TensorFlow的版本号由三个数字组成,分别是主版本号、次版本号和修订号。例如,TensorFlow 2.4.1中,主版本号为2,次版本号为4,修订号为1。 2. TensorF…

    other 2023年5月7日
    00
  • Android App隐私合规检测辅助工具Camille详解

    以下是使用标准的Markdown格式文本,详细讲解Android App隐私合规检测辅助工具Camille的完整攻略: Android App隐私合规检测辅助工具Camille详解 什么是Camille? Camille是一款用于辅助Android开发者进行隐私合规检测的工具。它可以帮助开发者快速识别和解决App中可能存在的隐私问题,确保App符合相关的隐私…

    other 2023年10月14日
    00
合作推广
合作推广
分享本页
返回顶部