Shiro的认证和权限控制
发布日期:2021-05-15 10:32:22 浏览次数:24 分类:精选文章

本文共 2697 字,大约阅读时间需要 8 分钟。

Apache Shiro 权限控制详解

权限控制的方式

权限控制可以从类别上分为两大类:

  • 认证(Authentication):身份认证,判断用户身份。
  • 授权(Authorization):功能权限管理,限制用户可执行的操作。
  • 权限控制的级别

    从控制级别(模型)上分,权限控制可分为以下几种方式:

  • URL级别(粗粒度):基于过滤器实现,适合大范围控制。
  • 方法级别(细粒度):基于AOP切面编程,适合小范围控制。
  • 页面级别:通过自定义标签实现,适合特定页面显示控制。
  • 数据级别:基于数据字段实现,最细化的权限控制。
  • URL级别的权限控制

    web.xml中配置一个过滤器Filter,实现URL级别的粗粒度权限控制。

    过滤器逻辑:通过截取URL路径,获取目标资源路径,结合数据库查询判断当前登录用户是否有权限访问该资源。
    优点:控制粒度大,适合大范围场景。

    方法级别的权限控制

    基于Spring AOP的切面编程实现细粒度权限控制。

    • 注解:在目标方法上添加权限注解,例如@RequiresAuthentication@RequiresRoles
    • 代理:通过动态代理技术(如CGLIB代理)执行权限检查,若无权限抛出异常终止方法执行。
      优点:控制粒度细,适合小范围场景。

    页面级别的权限控制

    通过自定义标签实现页面显示控制,实现细粒化的权限展示。

    例如,使用Shiro标签库<shiro:hasPermission name="user">判断当前用户是否有权限访问特定资源。

    数据级别的权限控制

    在数据表中增加权限字段,绑定数据与权限。

    在查询数据时,结合当前用户的权限信息进行过滤,确保数据访问的安全性。
    例如,查询用户可访问的数据范围时,结合用户ID和权限信息进行限制。

    Apache Shiro权限控制实现

    Shiro框架基础

    Apache Shiro是一个功能强大的权限管理框架,支持多种认证和授权方式。

    • Authentication(认证):通过UsernamePasswordToken实现用户名密码认证。
    • Authorization(授权):通过AuthorizationInfo返回当前用户的权限信息。

    Shiro配置示例

    ApplicationContext.xml中配置Shiro安全管理器和过滤器链:

    /login.jsp = anon
    /validatecode.jsp = anon
    /js/** = anon
    /css/** = anon
    /images/** = anon
    /user_login.action = anon
    /page_base_staff.action = anon
    /page_base_region.action = perms["region"]
    /page_base_subarea.action = roles["weihu"]
    /** = authc

    用户认证逻辑

    实现自定义Realm来处理用户登录逻辑:

    @Override
    protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
    UsernamePasswordToken upToken = (UsernamePasswordToken) token;
    User user = userService.findByUsername(upToken.getUsername());
    if (user == null) {
    return null;
    } else {
    return new SimpleAuthenticationInfo(user, user.getPassword(), super.getName());
    }
    }

    用户退出与密码修改

    通过Subject#logout()实现用户退出,editPassword方法结合Service层更新用户信息。

    用户授权控制

    在目标方法上使用Shiro注解,例如:

    @RequiresRoles("admin")
    public void editPassword() {
    // 具体实现逻辑
    }

    方法级别权限控制示例

    ApplicationContext.xml中启用Shiro AOP:

    结合注解实现权限控制:

    @Autowire
    private UserService userService;
    @Action(value = "user_editPassword")
    public String editPassword() throws Exception {
    User loginUser = (User) SecurityUtils.getSubject().getPrincipal();
    // 具体实现逻辑
    }

    常见异常处理

    • 动态代理异常:配置CGLIB代理。
    • 类型转换异常:递归查找泛型类型。
    • 空指针异常:通过Setter注入Service或修改Struts配置。

    页面标签实现

    在页面中引入Shiro标签库:

    <%@ taglib uri="http://shiro.apache.org/tags" prefix="shiro" %>

    结合标签实现权限控制:

    显示功能按钮

    数据库设计

    权限系统通常需要以下表结构:

    • User(用户):用户信息表。
    • Role(角色):角色表,存储角色名称和权限组。
    • Permission(权限):权限表,存储单个权限。
    • Function(功能):功能权限表,存储功能权限。
    • User_Role(用户角色):多对多关系表。
    • Role_Permission(角色权限):多对多关系表。

    通过合理设计表结构和数据关系,实现权限控制的业务需求。

    上一篇:MyEclipse,Eclipse开发Maven项目提示:程序包org.junit不存在解决方案
    下一篇:修改layui的后台模板的左侧导航栏可以伸缩

    发表评论

    最新留言

    能坚持,总会有不一样的收获!
    [***.219.124.196]2025年04月23日 06时38分05秒