2015-02-13 6 views
1

Я только начал использовать Apache Shiro и Stormpath. В jsp все работает нормально и, как ожидалось. Но как я могу получить текущие данные пользователя и его пользовательские поля внутри сервлета?Shiro + Stormpath получает текущего пользователя в сервлете

@WebServlet("/test") 
public class Foo extends HttpServlet { 

    @Override 
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { 
     Subject currentUser = SecurityUtils.getSubject(); 
     Session session = currentUser.getSession(); 

     // how to get username and custom fields hereg?? 
    } 
} 

ответ

2

Вы можете получить все доступные пользовательские данные для текущего Subject так:

Map<String, String> userAttributes = SecurityUtils.getSubject().getPrincipals().oneByType(java.util.Map.class); 
System.out.println("Account href: " + userAttributes.get("href")); 
System.out.println("Username: " + userAttributes.get("username")); 
// other attributes available 

В случае, если вы также хотите, чтобы манипулировать фактические Stormpath ресурсов (как Account и CustomData):

ApplicationRealm realm = ((ApplicationRealm)((RealmSecurityManager) SecurityUtils.getSecurityManager()).getRealms().iterator().next()); 
Client client = realm.getClient(); //The Client object is what allows you to communicate with Stormpath 
Account account = client.getResource(userAttributes.get("href"), Account.class); //The actual Stormpath Account object belonging to the current Subject 
CustomData customData = account.getCustomData(); 
//or, if you want to obtain the CustomData without first retrieving the Account, thus avoiding an unnecessary server hit: 
//CustomData customData = client.getResource(userAttributes.get("href") + "/customData", CustomData.class); 
0

Если вы используете новый stormpath-servlet-plugin, вам просто нужно:

Account account = AccountResolver.INSTANCE.getAccount(request); 

Обычно вы назовете это в своем методе HttpServlet.doGet(...) или doPost(...).

Для получения более подробной информации см. this Stormpath blog post.

Однако это в настоящее время (5 октября 2015) немного беспорядка, если вы используете Сиро в качестве последней stormpath-shiro-core является 0.6.0, который зависит от stormpath-sdk-api версии, которая не совместим с тем, что требуется какой-либо из имеющихся stormpath-servlet-plugin версии.

Предположительно, это будет разрешено после того, как они выпустят окончательную версию RC-версии плагина.

Если вы посмотрите на сообщение в блоге и full plugin documentation, вы можете может решить, хотя вы можете обойтись без Сиро.

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