我正在实现自定义AccessDecisionVoter,我有一个JPA存储库,我需要在自定义AccessDecisionVoter实现中自动装配。 @Autowire根本不适用于此类中的Service或Jpa Repository。
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
答案 0 :(得分:1)
通常,如果您在部署期间没有看到任何错误,autowired
工作正常,因为默认情况下它是必需的。请参阅@Autowired documentation
无论如何,尝试使用@Autowired
构造函数而不是@Autowired
属性。
private PrivilegeRepository privilegeRepo;
@Autowired
public DynamicAuthorizationVoter(PrivilegeRepository privilegeRepo){
this.privilegeRepo = privilegeRepo;
}
有了这个,您可以在此构造函数中添加断点并对其进行调试,以了解autowire
进程是否运行良好。
另请注意,要使用DynamicAuthorizationVoter
实例,您不得将其声明为new
。您必须在要使用它的相关类中包含以下代码。
@Autowired
AccessDecisionVoter dynamicAuthorizationVoter;
希望它有所帮助,