Я пытаюсь интегрировать Apache Shiro в моем приложении Spring Boot (2.0.4) с областью JDBC и Jersey REST, используя аннотации Shiro для проверки разрешений.Однако работает только часть аутентификации, и shiro не вызывает авторизацию для аннотации.
Моя конфигурация Shiro выглядит следующим образом:
@Bean(name = "realm")
@DependsOn("lifecycleBeanPostProcessor")
public JdbcRealm jdbcRealm() {
MyJDBCRealm realm = new MyJDBCRealm();
Sha256CredentialsMatcher credentialsMatcher = new Sha256CredentialsMatcher();
credentialsMatcher.setStoredCredentialsHexEncoded(false);
credentialsMatcher.setHashIterations(1024);
realm.setCredentialsMatcher(credentialsMatcher);
realm.setAuthenticationQuery("SELECT password, salt FROM User WHERE email = ?");
realm.setPermissionsLookupEnabled(true);
realm.setUserRolesQuery("select roleName from UserRole where email = ?");
realm.setPermissionsQuery("select permission from RolesPermission where roleName = ?");
realm.init();
return realm;
}
@Bean(name = "securityManager")
public DefaultWebSecurityManager securityManager() {
DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();
securityManager.setRealm(jdbcRealm());
return securityManager;
}
@Bean
public ShiroFilterChainDefinition shiroFilterChainDefinition() {
DefaultShiroFilterChainDefinition chainDefinition = new DefaultShiroFilterChainDefinition();
// use permissive to NOT require authentication, our controller Annotations will decide that
//chainDefinition.addPathDefinition("/**", "authcBasic[permissive]");
chainDefinition.addPathDefinition("/**", "authcBasic");
return chainDefinition;
}
@Bean(name = "shiroFilter")
public AbstractShiroFilter shiroFilter() throws Exception {
ShiroFilterFactoryBean shiroFilter = new ShiroFilterFactoryBean();
shiroFilter.setSecurityManager(securityManager());
Map<String, String> filterChainDefinitionMapping = new HashMap<>();
filterChainDefinitionMapping.put("/**", "authcBasic");
shiroFilter.setFilterChainDefinitionMap(filterChainDefinitionMapping);
Map<String, Filter> filters = new HashMap<>();
filters.put("anon", new AnonymousFilter());
filters.put("authcBasic", new BasicHttpAuthenticationFilter());
filters.put("authcBasicRoles", new RolesAuthorizationFilter());
filters.put("authcBasicPermissions", new PermissionsAuthorizationFilter());
shiroFilter.setFilters(filters);
return (AbstractShiroFilter) shiroFilter.getObject();
}
@Bean (name = "lifecycleBeanPostProcessor")
public static LifecycleBeanPostProcessor lifecycleBeanPostProcessor() {
return new LifecycleBeanPostProcessor();
}
@Bean
@ConditionalOnMissingBean
public AuthorizationAttributeSourceAdvisor getAuthorizationAttributeSourceAdvisor(DefaultSecurityManager securityManager) {
// This is to enable Shiro's security annotations
AuthorizationAttributeSourceAdvisor sourceAdvisor = new AuthorizationAttributeSourceAdvisor();
sourceAdvisor.setSecurityManager(securityManager);
return sourceAdvisor;
}
@ConditionalOnMissingBean
@Bean(name = "defaultAdvisorAutoProxyCreator")
@DependsOn("lifecycleBeanPostProcessor")
public DefaultAdvisorAutoProxyCreator defaultAdvisorAutoProxyCreator() {
DefaultAdvisorAutoProxyCreator proxyCreator = new DefaultAdvisorAutoProxyCreator();
proxyCreator.setProxyTargetClass(true);
return proxyCreator;
}
@Bean
public CacheManager cacheManager() {
// Caching isn't needed in this example, but we will use the MemoryConstrainedCacheManager for this example.
return new MemoryConstrainedCacheManager();
}
С помощью вышеприведенного кода Shiro выполняет аутентификацию, но доходит доКонтроллер REST в Джерси не вызывает авторизацию для аннотации Shiro
@POST
@Path("/authorize/")
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
@RequiresPermissions("service:create")
public Session register(UserInfo inputData) throws AppException{.......
Если кто-то может сообщить мне, что мне не хватает, чтобы получить эту работу, было бы очень полезно.
В соответствии с просьбой добавить код дляMyJDBCRealm.
@ Открытый класс компонента MyJDBCRealm расширяет JdbcRealm {
@Autowired
UserManagerDAO userManagerDAO;
@Override
protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
// identify account to log to
UsernamePasswordToken userPassToken = (UsernamePasswordToken) token;
final String username = userPassToken.getUsername();
if (username == null) {
System.out.println("Username is null.");
return null;
}
// read password hash and salt from db
final User user = userManagerDAO.getUserByEmail(username);
if (user == null) {
System.out.println("No account found for user [" + username + "]");
return null;
}
// return salted credentials
SaltedAuthenticationInfo info = new MySaltedAuthentication(username, user.getPassword(), user.getSalt());
return info;
}
}
Я также предоставляю вам зависимость широпома, которую я использовал в этой весенней загрузке 2.0.4приложение.Обратите внимание, что используется весенняя загрузочная версия 2.0.4, в которой используется версия Jersey 2.26.Где-то я читал, что версия джерси 2.26 не работает с аннотацией shiro из-за некоторых проблем с внедрением.Однако, если я понижаю джерси до 2.25, некоторые инъекции пружинных бобов перестают работать, и сервер запускается при запуске.
<dependency>
<groupId>org.apache.shiro</groupId>
<artifactId>shiro-spring-boot-web-starter</artifactId>
<version>1.4.0-RC2</version>
</dependency>