Добавьте информацию в тему по apache shiro

Я использую апач сиро. Когда я хочу узнать, есть ли у пользователя разрешения и роли, я использую SecutiryUtils.getSubject(). Мне нравится знать, как добавить в тему дополнительную информацию, такую ​​как электронная почта, первичный ключ и любую другую деловую информацию, которая мне нужна, чтобы я мог получить эту информацию при необходимости.

Это мой shiro.ini:

[main]
ds = org.apache.shiro.jndi.JndiObjectFactory   
ds.requiredType = javax.sql.DataSource  
ds.resourceName = java:/comp/env/jdbc/myDS

# JDBC realm config  
jdbcRealm = com.mycompany.JdbcRealmImpl
jdbcRealm.permissionsLookupEnabled = true 
jdbcRealm.authenticationQuery = SELECT password FROM user WHERE username = ? AND status = 1
jdbcRealm.dataSource = $ds

sha256Matcher = org.apache.shiro.authc.credential.Sha256CredentialsMatcher
jdbcRealm.credentialsMatcher = $sha256Matcher

[urls]
/logout = logout
/** = authcBasic

Это мой JdbcRealm

public class JdbcRealmImpl extends JdbcRealm {

    public JdbcRealmImpl() {
        super();
    }

    @Override
    protected AuthenticationInfo doGetAuthenticationInfo(
            final AuthenticationToken token) throws AuthenticationException {

        final AuthenticationInfo info = super.doGetAuthenticationInfo(token);    

        // create a user to test
        final User user = new User();
        user.setId(11111);

        return new SimpleAuthenticationInfo(user, info.getCredentials(),
                getName());
    }

}

И вот код, в котором я пытаюсь получить информацию о пользователе.

    final Subject currentUser = SecurityUtils.getSubject();
    final User user = (User) currentUser.getPrincipal();
    // null
    System.out.println(user); 

person Tiago Wanke Marques    schedule 26.08.2014    source источник
comment
Похоже, пользователь не аутентифицирован. Каков результат SecurityUtils.getSubject().isAuthenticated() в фрагменте кода?   -  person Wouter    schedule 28.08.2014
comment
Исход верный.   -  person Tiago Wanke Marques    schedule 28.08.2014
comment
Каким-то образом это работает, я думаю, что это был кеш в почтальоне, и он не выполнял doGetAuthenticationInfo. Спс за помощь.   -  person Tiago Wanke Marques    schedule 28.08.2014


Ответы (1)


Вы должны просто поместить это в базу данных и получить ее, используя имя пользователя субъекта (например, адрес электронной почты).

person Wouter    schedule 27.08.2014
comment
Я пытаюсь использовать этот подход, но когда я пытаюсь получить принципала, он становится нулевым. - person Tiago Wanke Marques; 27.08.2014
comment
Поделитесь кодом и конфигурацией, которые вы используете, если хотите, чтобы они были проанализированы - person Wouter; 27.08.2014
comment
@Wouter Согласно вашему ответу, означает ли это, что Широ не поддерживает раскрытие информации, прикрепленной к субъекту? Загрузка дополнительной информации из базы данных после входа в систему означает, что каждый раз будет выполняться два доступа к базе данных. - person Mickael Marrache; 01.03.2016
comment
@MickaelMarrache Если вы хотите получать данные для субъекта несколько раз, не обращаясь к базе данных, вы можете сохранить их в объекте сеанса пользователя. shiro.apache.org/session-management.html - person Wouter; 01.03.2016
comment
@Wouter Информация о пользователе загружается одним или несколькими Realm. Я хотел бы получить информацию, не связанную с безопасностью, вместе с информацией о безопасности (например, пароль). На данном этапе (т. е. в Realm) к сеансу нельзя получить доступ (по крайней мере, не с помощью методов, определенных интерфейсом AuthorizingRealm). Поэтому я, наконец, нашел решение. Основной тип — объект. Я думаю, Широ ожидает, что мы будем использовать свой особый класс. Я проверил, и это работает. Просто передайте свой пользовательский экземпляр в качестве принципала возвращаемому экземпляру AuthenticationInfo. - person Mickael Marrache; 01.03.2016