当前位置: 首页 > 知识库问答 >
问题:

Apache shiro HTTP方法级别权限

慎望
2023-03-14

我正在开发一个基于REST的web应用程序,其中REST服务集成了Apache shiro,以执行基本身份验证和基于角色的授权。

现在,我想通过方法级别的权限配置(REST情况下的微服务)来增强授权功能。如果我没有错的话,Apache shiro提供了HttpMethodPermissionFilter类,该类可以用作过滤器,根据其HTTP方法(GET、POST、DELETE、HEAD等)限制传入请求它在内部检查我们配置的数据库的roles\u permissions表或INI配置文件中的权限。

因此,为了实现基于HTTP方法的权限功能,我需要对我的shiro.ini文件进行任何更改吗?或者我的jdbc领域有事情要做。

西罗。ini文件

[main]
userRoles = org.apache.shiro.web.filter.authz.RolesAuthorizationFilter

jdbcRealm = my.custom.jdbc.realm.YhJdbcRealm
securityManager.realms = $jdbcRealm

[urls]
# Allowing login page to any user
/rest/login/** = anon

# Page 1
/rest/page1/** = noSessionCreation, authcBasic, userRoles[role1]


# page 2
/rest/page2/** = noSessionCreation, authcBasic, userRoles[role1,role2,role3]


# page 3
/yhrest/page3/** = noSessionCreation, authcBasic, userRoles[role1,role3]

/rest/** = noSessionCreation, authcBasic

自定义jdbc领域

public class YhJdbcRealm extends JdbcRealm
{
    public YhJdbcRealm()
    {
        loadDataSource();
    }

    private void loadDataSource()
    {
        this.dataSource = JdbcConnection.initConnection();
        this.permissionsLookupEnabled = true;
        this.authenticationQuery = "SELECT password FROM users WHERE username = ?";
        this.userRolesQuery = "SELECT role_name FROM user_roles WHERE username = ?";
        this.permissionsQuery = "SELECT permission FROM roles_permissions_temp WHERE role_name = ?";
    }

    @Override
    protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException
    {
        AuthenticationInfo info = super.doGetAuthenticationInfo(token);
        return info;
    }
}

我是apache shiro的新手,所以任何参考都将不胜感激。谢谢

共有1个答案

南门向荣
2023-03-14

查看HttpMethodPermissionFilter的文档,假设您拥有以下CRUD权限:

  • abc:创建

您的映射如下所示:

[urls]
/rest/page1/** = noSessionCreation, authcBasic, rest[abc]

所有到rest/page1/***的GET请求都将映射到权限rest[abc:读取]

 类似资料:
  • 我们在hello-world-test的基础上,我们新建了一个名为method-security的 Gradle 项目。 本项目用于演示方法级别的安全设置。 build.gradle 修改 build.gradle 文件,让我们的method-security项目成为一个新的项目。 修改内容也比较简单,修改项目名称及版本即可。 jar { baseName = 'method-securi

  • Dorado支持对方法级别的超时时间设置,默认使用统一的值 1. XML配置方式 <bean id="clientProxy" class="com.meituan.dorado.config.service.spring.ReferenceBean" destroy-method="destroy"> <property name="serviceInterface" value="com.

  • 5.2 权限和保护级别 权限内有四种类型的保护级别,它们包括正常,危险,签名和签名或系统。 根据保护级别,权限被称为正常权限,危险权限,签名权限或签名或系统权限。 以下部分中使用这些名称。

  • 当我运行应用程序并点击http://localhost:8080/hello时,一切都很好: 但是,如果我删除了方法上的注释: 然后参数变为null,aspect方法抛出NullPointerException。 这似乎起作用了,但这是一个好的解决办法吗? 编辑:此解决方案也不起作用。如果我在类和方法级别上都有注释,假设类级别的注释值为false,而方法级别为true,那么注释值将为false。

  • Spring Transaction Propagation如何为Propagation_REQUIRED和Propagation_REQUIRED_NEW工作? 请提供有关类到类级别和方法到方法级别的传播的信息。 我还需要知道如何初始化/启动这些事务,并在当前事务完成时恢复以前的事务,以进行传播。 在需要传播和需要新传播的情况下使用单个事务时,事务将如何决定何时需要提交/回滚?

  • 问题内容: 我对Spring 3.2.3 @Transactional注解有疑问。我的服务类如下所示: 如果我调用persist()方法,所有方法都可以正常工作。但是,如果我在类级别将@Transactional注释掉- 事务将不会启动。谁能告诉我为什么Spring只能在methol级忽略@Transactional? 问题答案: 您不能从processDisclosureData()调用pers