Apache Управление сеансами Shiro с помощью Spring Boot - PullRequest
0 голосов
/ 03 мая 2020

В настоящее время я разрабатываю приложение, в которое хочу интегрировать Apache Shiro Session Management с Spring Boot. Поэтому я изучил Apache Shiro с их официального сайта, https://shiro.apache.org/get-started.html, но они не предоставили полного руководства по интеграции apache управления сессиями shiro в весеннюю загрузку.

Следующий фрагмент кода, который я написал во время исследования, но он работает не так, как ожидалось. Он не входит в пользовательский класс областей.

WEB-INF / shiro.ini

[main]
authc.loginUrl = /login.html
authc.successUrl = /home.html

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

myAuthorizingRealm = in.cas.sms.common.servlet.MyAuthorizingRealm
securityManager.realms = $myAuthorizingRealm

[urls]
/login.html = authc
/logout = logout

web. xml конфигурация

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

<filter>
    <filter-name>shiroFilter</filter-name>
    <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
    <init-param>
        <param-name>targetFilterLifecycle</param-name>
        <param-value>true</param-value>
    </init-param>
</filter>

<filter-mapping>
    <filter-name>shiroFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

ShiroFilter. java

@Component("shiroFilter")
public class ShiroFilter extends ShiroFilterFactoryBean {

    private static final Logger LOG = LoggerFactory.getLogger(ShiroFilter.class);

    @Autowired
    private MyAuthorizingRealm authorizingRealm;

    public ShiroFilter () {
        LOG.debug("Setting realm...");
        ((RealmSecurityManager) this.getSecurityManager()).setRealm(authorizingRealm);
    }
}

MyAuthorizingRealm. java

@Component
public class MyAuthorizingRealm extends AuthorizingRealm implements Serializable {

    private static final long serialVersionUID = 1L;
    private static final Logger LOG = LoggerFactory.getLogger(SmsAuthorizingRealm.class);

    @Autowired
    private MemberService memberService;

    @Override
    protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {
        return null;
    }

    @Override
    protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
        LOG.debug("Inside SmsAuthorizing Realm!");
        UsernamePasswordToken upToken = (UsernamePasswordToken) token;

        String applicationId = null;
        try {
            applicationId = memberService.getApplicationId(upToken.getUsername(), String.valueOf(upToken.getPassword()));
        } catch (NoSuchAlgorithmException e) {
            LOG.error("Algorithm not found for hashing {}" ,e);
        }

        if (StringUtils.isEmpty(applicationId)) {
            throw new UnknownAccountException("Member does not exists!");
        }

        MemberEntity memberEntity = memberService.getMemberEntityByAppId(applicationId);
        if(memberEntity == null) {
            throw new UnknownAccountException("Member does not exists!");
        }

        SimpleAccount info = new SimpleAccount(memberEntity.getUsername(), memberEntity.getPassword(), getName());
        SimplePrincipalCollection principalCollection = new SimplePrincipalCollection(token.getPrincipal(), getName());
        info.setCredentialsSalt(ByteSource.Util.bytes(memberEntity.getUsername()));
        principalCollection.add(memberEntity, PlatformConstants.CURRENT_MEMBER);
        info.setPrincipals(principalCollection);
        return info;
    }
}

Обратите внимание, что в приведенном выше классе MemberService является классом обслуживания SpringBoot, который обрабатывает результаты запросов и выборки, связанные с базой данных. И я получаю идентификатор приложения из базы данных. По сути, я аутентифицирую пользователя с моей базой данных в области и устанавливаю для этого пользователя принципала. (Обратите внимание, здесь пользователь означает MemberEntity, который содержит поля имени пользователя и пароля) И в моем логине. html страница содержит форму, которая имеет action = 'login' и содержит поля имени пользователя и пароля.

Итак, мои вопросы,
1. Когда я нажимаю / вход в систему, тогда какой фильтр вызывается apache shiro.
2. Когда речь идет о пользовательских классах Realm.
3. И когда вызывать SecurityUtils.getSubject (), чтобы начать сеанс. (Имеется в виду царство / фильтр / сервлет).

Заранее спасибо, я исследовал это за последние 2 недели, если кто-то мне поможет, тогда это действительно полезно для меня.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...