@Autowired不使用自定义AccessDecisionVoter

时间:2017-02-08 03:55:03

标签: spring spring-boot spring-security spring-data-jpa

我正在实现自定义AccessDecisionVoter,我有一个JPA存储库,我需要在自定义AccessDecisionVoter实现中自动装配。 @Autowire根本不适用于此类中的Service或Jpa Repository。

Project Structure 项目结构

Application.java

@SpringBootApplication
@ComponentScan(basePackages="com")
public class Application {

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

DynamicAuthorizationVoter.java

@Component
public class DynamicAuthorizationVoter implements AccessDecisionVoter<FilterInvocation> {
    @Autowired
    private PrivilegeRepository privilegeRepo;

    @Override
    public boolean supports(ConfigAttribute attribute) {
        return true;
    }

    @Override
    public boolean supports(Class clazz) {
        return true;
    }

    @Override
    public int vote(Authentication authentication, FilterInvocation object, Collection<ConfigAttribute> collection) {
        String url = determineModule(object);
        if (authentication == null || authentication instanceof AnonymousAuthenticationToken) {
            return ACCESS_ABSTAIN;
        }

        return isAccessGranted(authentication, object.getRequestUrl())? ACCESS_GRANTED : ACCESS_DENIED;
    }

    String determineModule(FilterInvocation filterObject){
        String url = filterObject.getRequestUrl();
        return url;
    }

    boolean isAccessGranted(Authentication authObject, String url){

        Set<Privilege> privileges = privilegeRepo.findByUrl(url);

        String userRole;
        for(GrantedAuthority authority : authObject.getAuthorities()){
            userRole = authority.getAuthority();
            for(Privilege priv : privileges){
                if(priv.equals(userRole)){
                    return true;
                }
            }
        }

        return false;
    }
}

PrivilegeRepository.java

public interface PrivilegeRepository extends JpaRepository<Privilege, Long> {
    Set<Privilege> findByName(String name);
    Set<Privilege> findByUrl(String url);
}

为了让@Autowire在DynamicAuthorizationVoter类中工作,我将@Component更改为@Service,@ Configuration和我在此处找到的所有其他内容,但它们都不起作用。这个JPA资源库在其他任何地方都是@Autowired。

我将非常感谢所有的帮助。

-Adil

1 个答案:

答案 0 :(得分:1)

通常,如果您在部署期间没有看到任何错误,autowired工作正常,因为默认情况下它是必需的。请参阅@Autowired documentation

无论如何,尝试使用@Autowired构造函数而不是@Autowired属性。

private PrivilegeRepository privilegeRepo;

@Autowired
public DynamicAuthorizationVoter(PrivilegeRepository privilegeRepo){
  this.privilegeRepo = privilegeRepo;
}

有了这个,您可以在此构造函数中添加断点并对其进行调试,以了解autowire进程是否运行良好。

另请注意,要使用DynamicAuthorizationVoter实例,您不得将其声明为new。您必须在要使用它的相关类中包含以下代码。

@Autowired
AccessDecisionVoter dynamicAuthorizationVoter;

希望它有所帮助,