Shiro Annotation не работает с Spring Boot 2.0.4 с Jersey REST и JDBC Realm - PullRequest
0 голосов
/ 16 сентября 2018

Я пытаюсь интегрировать 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>
...