2017-01-29 16 views
0

Я разрабатываю веб-приложение на основе REST, в котором службы отдыха имеют интегрированный пакет Apache для выполнения базовой аутентификации и авторизации на основе ролей.Apache shiro + разрешение на уровне HTTP-метода

Теперь я хочу улучшить функциональность авторизации с настройкой разрешений на уровне метода (Micro-сервис в случае REST). Если я не ошибаюсь, Apache siro предоставляет класс HttpMethodPermissionFilter, который может использоваться как фильтр для ограничения входящих запросов на основе его метода HTTP (GET, POST, DELETE, HEAD и т. Д.), Который внутренне проверяет разрешения из таблицы role_permissions база данных, которую мы сконфигурировали, или файл конфигурации INI.

Итак, чтобы реализовать функциональность разрешений на основе метода HTTP, мне нужно внести какие-либо изменения в свой файл shiro.ini. Или у моей области jdbc есть чем заняться.

shiro.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 так что любая ссылка была бы признательна. Спасибо.

ответ

0

Взгляните на документ для HttpMethodPermissionFilter, позволяет сказать, что у вас есть следующие разрешения CRUD для /rest/page1:

  • abc:create
  • abc:read
  • abc:update
  • abc:delete

Вашотображение будет выглядеть следующим образом:

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

Все GET запросы к /rest/page1/** будут сопоставлены с разрешения rest[abc:read]

+0

Так вы имеете в виду «ABC» является пользователем здесь, и он собирается иметь разрешения для всех CRUD для страницы 1. отлично, в каком формате или как он будет храниться в базе данных? вы можете поделиться схемой и значениями, которые мне потребуются для фактической проверки прав на конкретную страницу. –

+0

Да, «abc» будет базовым пользовательским разрешением, я собираюсь использовать 'page1', но хотел сохранить их отдельно для объяснения. Схема зависит от вас, но, похоже, для вашего примера столбец «разрешение» отображает разрешения для ролей. Взгляните на следующие ссылки для получения дополнительной информации: [Блог о разрешениях Shiro] (https://stormpath.com/blog/protecting-jax-rs-resources-rbac-apache-shiro#authorize-the-stormtroopers- jax-rs-resource), [Широкие разрешения] (https://shiro.apache.org/permissions.html) –