代码之家  ›  专栏  ›  技术社区  ›  Sergey Kryazhev

如何从Apache Shiro中的负责人那里获得角色?

  •  2
  • Sergey Kryazhev  · 技术社区  · 8 年前

    我有点困在这里了。

    [main]
    cacheManager = org.apache.shiro.cache.MemoryConstrainedCacheManager
    securityManager.cacheManager = $cacheManager
    
    # Create JDBC realm.
    jdbcRealm = org.apache.shiro.realm.jdbc.JdbcRealm
    
    # Configure JDBC realm datasource.
    ds = org.postgresql.ds.PGSimpleDataSource
    ds.databaseName = pg_sensor
    ***
    jdbcRealm.dataSource = $ds
    
    # Configure JDBC realm SQL queries.
    jdbcRealm.authenticationQuery = SELECT pass FROM users WHERE name = ?
    # user id is a user Role )
    jdbcRealm.userRolesQuery = SELECT id FROM users WHERE name = ?
    

    所以,我使用 userid 在一个场景中,我需要获取角色名称才能继续。

    有谁能建议如何从 Principal ( SecurityUtils.getSubject().getPrincipal()

    我想我们需要使用 getRoles() SimpleAccount .

    1 回复  |  直到 8 年前
        1
  •  3
  •   Al-un    8 年前

    在此之前,请先对您的shiro.ini发表一些评论:

    角色查询

    首先,你的 jdbcRealm.userRolesQuery 没有真正意义:您应该获取角色,而不是此查询的用户。

    CREATE TABLE user{
        id          INTEGER,
        username    VARCHAR,
        password    VARCHAR
    }
    
    CREATE TABLE user_role{
        id          INTEGER,
        role_name   VARCHAR,
        username    VARCHAR
    }
    

    您的查询如下:

    # Configure JDBC realm SQL queries.
    jdbcRealm.authenticationQuery = SELECT password FROM user WHERE username = ?
    # user id is a user Role )
    jdbcRealm.userRolesQuery = SELECT role_name FROM user_role WHERE username = ?
    

    最重要的

    我假设您的主题已经成功通过身份验证。目前为止 SecurityUtils.getSubject().getPrincipal() 将只返回 登录 用户名 username

    我想,你看起来很帅 此经过身份验证的用户是否具有角色“MyRole”? .在这种情况下,你可以四处看看 SecurityUtils.getSubject().hasRole("MyRole") .据我所知,没有办法列出一个主题当前的所有角色。您只能检查主题是否具有这样或那样的角色

    如果我误解了你的问题,请随时发表评论