В настоящее время я разрабатываю приложение, в которое хочу интегрировать 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 недели, если кто-то мне поможет, тогда это действительно полезно для меня.