2017-01-29 36 views
1

Я пытаюсь адаптировать этот отличный штурмовой пост от Брайана Демерса - https://stormpath.com/blog/protecting-jax-rs-resources-rbac-apache-shiro - в моих собственных целях и до сих пор он работает очень хорошо - за исключением того, что теперь я хочу добавить штурмарт для пользователя/role, а затем пользователи в файле siro-ini.using shiro with stormpath для jax-rs rbac

Я использую Apache Shiro shiro-jaxrs 1.4.0-RC для защиты конечной точки REST с помощью jax-rs. Он работает нормально. Я способен избирательно защитить конечные точки с помощью @RequiresPermissions тег как так:

@Path("/scan") 
@Produces("application/json") 
public class ScanService { 

final static Logger logger = Logger.getLogger(ScanService.class); 

@GET 
@Path("/gettest") 
@RequiresPermissions("troopers:read") 
public List<Barcode> gettest() throws Exception { 

ArrayList<Barcode> listofstrings = new ArrayList<Barcode>(); 
    Barcode b = new Barcode(); 
    b.setBarcode("this is a big barcode"); 
    listofstrings.add(b); 

    return listofstrings; 

} 


@GET 
@Produces(MediaType.APPLICATION_JSON ) 
@Path("/gettest2") 
public List<Barcode> gettest2() throws Exception { 
    ArrayList<Barcode> listofstrings = new ArrayList<Barcode>(); 
    Barcode b = new Barcode(); 
    b.setBarcode("this is a BIGGER barcode"); 
    listofstrings.add(b); 

    return listofstrings; 
} 

У меня есть класс приложения, чтобы добавить свой ресурс и класс ShiroFeature так:

package ca.odell.erbscan; 
import ca.odell.erbscan.ws.ScanService; 

import javax.ws.rs.ApplicationPath; 
import javax.ws.rs.core.Application; 
import java.util.HashSet; 
import java.util.Set; 

import org.apache.shiro.web.jaxrs.ShiroFeature; 
import com.stormpath.shiro.jaxrs.StormpathShiroFeature; 


@ApplicationPath("/") 
public class ERBApplication extends Application { 

@Override 
public Set<Class<?>> getClasses() { 
    Set<Class<?>> classes = new HashSet<Class<?>>(); 

    // register Shiro 
    classes.add(ShiroFeature.class); 
    // register resources 
    classes.add(ScanService.class); 

    return classes; 
} 
} 

и мой web.xml инициализировать мой класс Application следующим образом:

<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0"> 
<display-name>ERBSCAN</display-name> 
<servlet> 


    <servlet-name>ERBRest</servlet-name> 
    <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class> 
    <init-param> 
     <param-name>jersey.config.server.provider.packages</param-name> 
     <param-value>ca.odell.erbscan</param-value> 
    </init-param> 

    <init-param> 
     <param-name>javax.ws.rs.Application</param-name> 
     <param-value>ca.odell.erbscan.ERBApplication</param-value> 
    </init-param> 


    <load-on-startup>1</load-on-startup> 
</servlet> 



<servlet-mapping> 
    <servlet-name>ERBRest</servlet-name> 
    <url-pattern>/rest/*</url-pattern> 
</servlet-mapping> 

<listener> 
<listener-class>org.apache.shiro.web.env.EnvironmentLoaderListener</listener-class> 
</listener> 

<filter> 
    <filter-name>ShiroFilter</filter-name> 
    <filter-class>org.apache.shiro.web.servlet.ShiroFilter</filter-class> 
</filter> 

<filter-mapping> 
    <filter-name>ShiroFilter</filter-name> 
    <url-pattern>/*</url-pattern> 
    <dispatcher>REQUEST</dispatcher> 
    <dispatcher>FORWARD</dispatcher> 
    <dispatcher>INCLUDE</dispatcher> 
    <dispatcher>ERROR</dispatcher> 
</filter-mapping> 


</web-app> 

и, наконец, мой shiro.ini

[main] 



cacheManager = org.apache.shiro.cache.MemoryConstrainedCacheManager 
securityManager.cacheManager = $cacheManager 



sessionManager = org.apache.shiro.web.session.mgt.DefaultWebSessionManager 
securityManager.sessionManager = $sessionManager 
securityManager.sessionManager.sessionIdCookieEnabled = false 
securityManager.sessionManager.sessionIdUrlRewritingEnabled = false 


[urls] 
/** = noSessionCreation, authcBasic[permissive] 

[users] 
# format: username = password, role1, role2, ..., roleN 
root = secret,admin 
emperor = secret,admin 
officer = secret,officer 
guest = secret 

[roles] 

admin = * 
officer = troopers:create, troopers:read, troopers:update 

Что я хочу сделать дальше, это добавить Stormpath для RBAC, а не иметь пользователей и роли в файле. Я чувствую, что есть простой способ сделать это и что я его переусердствую.

Я думал, что это будет довольно простой способ добавления в моем shiro.ini:

stormpathClient = com.stormpath.shiro.client.ClientFactory 
stormpathClient.cacheManager = $cacheManager 

stormpath.application.href=http://.... 

Но я был неправ. Может ли кто-нибудь указать мне в правильном направлении?

ответ

0

Я собираюсь ответить на свой вопрос здесь. Я не думаю, что это лучшее решение, но мне удалось найти работу.

Я следил за этим уроком веб-приложений с сайта сиро.

https://shiro.apache.org/webapp-tutorial.html

Я проверил step6 проекта и копировали [главный] раздел shiro.ini следующим образом: Обратите внимание, что я добавил

https://api.stormpath.com/v1/applications/ $ STORMPATH_APPLICATION_ID

В нижней части [основной] раздел.

cacheManager = org.apache.shiro.cache.MemoryConstrainedCacheManager 
securityManager.cacheManager = $cacheManager 

stormpathClient = com.stormpath.shiro.client.ClientFactory 
stormpathClient.cacheManager = $cacheManager 

# we can disable session tracking completely, and have Stormpath manage  it for us. 
sessionManager = org.apache.shiro.web.session.mgt.DefaultWebSessionManager 
securityManager.sessionManager = $sessionManager 
securityManager.sessionManager.sessionIdCookieEnabled = false 
securityManager.sessionManager.sessionIdUrlRewritingEnabled = false 

stormpathRealm = com.stormpath.shiro.realm.ApplicationRealm 
stormpathRealm.client = $stormpathClient 

stormpathRealm.groupRoleResolver.modeNames = name 
securityManager.realm = $stormpathRealm 

stormpathRealm.applicationRestUrl = https://api.stormpath.com/v1/applications/$STORMPATH_APPLICATION_ID 

После этого я полностью удалил раздел [users] на shiro.ini. Поскольку он теперь подключен к Stormpath, мне нужно добавить пользователей и группы. Мой ScanService (как описано выше), имеет метод, называемый gettest оформленный таким образом:

@GET 
    @Path("/gettest") 
    @RequiresPermissions("trooper:read") 
    public List<Barcode> gettest() throws Exception { 
. 
. 
. 

так что мне нужно, чтобы добавили учетную запись, группы и права доступа в stormpath, чтобы соответствовать разрешения на вышеуказанном ресурсе. Для этого мне нужно добавить учетную запись в Stormpath (у меня уже есть настройка приложения) в моем существующем тестовом приложении. Я также добавил группу, называемую офицером1. В рамках этой группы я добавил пользовательские данные массив с именем apacheShiroPermissions - я добавил строку пара ключ/значение «кавалерист: чтение» к apacheShiroPermissions - JSON находится ниже

{ 
    "apacheShiroPermissions": [ 
    "trooper:read" 
    ] 
} 

Тогда я просто сделал, что мой счет - в этот случай jlpicard был частью группы офицеров1.

Тестирование с завитка

curl --user jlpicard:Changeme1 http://localhost:8080/JPA1_Web_exploded/rest/scan/gettest 

Подтверждает jlpicard имеет доступ на уровне разрешений. Добавление и удаление записей строк в массив apacheShiroPermission, то есть позволяет получить мелкозернистый доступ.

Также удаление jlpicard у офицера1 или добавление к нему другой учетной записи работает как ожидалось.

Существует, несомненно, лучший способ сделать это, но у этого есть то, что сработало для меня до сих пор.

1

спасибо за чтение этого сообщения!

пару вещей, которые я хочу отметить:

  • Используйте эту функцию com.stormpath.shiro.jaxrs.StormpathShiroFeature вместо ShiroFeature
  • Ваш shiro.ini может выглядеть примерно так:
[main] 
cacheManager = org.apache.shiro.cache.MemoryConstrainedCacheManager 
securityManager.cacheManager = $cacheManager 

sessionManager = org.apache.shiro.web.session.mgt.DefaultWebSessionManager 
securityManager.sessionManager = $sessionManager 
securityManager.sessionManager.sessionIdCookieEnabled = false 
securityManager.sessionManager.sessionIdUrlRewritingEnabled = false 

[urls] 
/** = noSessionCreation, authcBasic[permissive] 

[stormpath] 
stormpath.application.href=http://.... 
  • Разрешения могут храниться как пользовательские или ролевые пользовательские данные, вы можете обновить Custo м данных в консоли администратора Stormpath:
{ 
    … your other custom data fields …, 
    "apacheShiroPermissions": [ 
     "troopers:create", 
     "troopers:read", 
     "troopers:update" 
    ] 
} 

Это blog post охватывает бит пользовательских данных, он немного старше, но по-прежнему актуальна. Я буду обновлять документ в этом в ближайшем будущем, поэтому приветствуем обратную связь.

Если это не поможет, вы также можете позвонить по телефону support, и мы отправим вас!

 Смежные вопросы

  • Нет связанных вопросов^_^