/**
* This BeanPostProcessor adds all {@link AccessDecisionVoter}s that are set with
* {@link #setAdditionalAccessDecisionVoters(List)} to beans that are instances of {@link AffirmativeBased}. This is the
* default {@link AccessDecisionManager} implementation that the spring security namespace handler creates.
* <p>
*
* The configuration could look like:
*
* <pre>
* {@code
* <bean id="voterAdder">
* <property name="additionalAccessDecisionVoters">
* <list>
* <bean />
* </list>
* </property>
* </bean>
* }
* </pre>
*/
@Component
public class VoterAdder implements BeanPostProcessor {
private List<AccessDecisionVoter> additionalAccessDecisionVoters;
public void setAdditionalAccessDecisionVoters(List<AccessDecisionVoter> additionalAccessDecisionVoters) {
this.additionalAccessDecisionVoters = additionalAccessDecisionVoters;
}
@Override
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
return bean;
}
@Override
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
if (bean instanceof AffirmativeBased) {
AffirmativeBased dm = (AffirmativeBased) bean;
additionalAccessDecisionVoters.addAll(dm.getDecisionVoters());
dm.setDecisionVoters(additionalAccessDecisionVoters);
}
return bean;
}
}