【发布时间】:2016-07-30 05:29:04
【问题描述】:
我有一个 Spring 4 MVC 应用程序,它对所有端点使用 @RestController 注释。该应用程序不使用web.xml 或applicationContext.xml 文件。一切正常,现在我正试图让 Apache Shiro 与其他一切合作。
我希望做的是让 Shiro 在访问我构建的任何 REST 服务时出现 authc/authz 问题时抛出异常。
到目前为止,我已经能够设置一个用于初始化 Shiro 的基本类:
@Configuration
public class ShiroInitializer {
@Bean(name = "realmLocal")
@DependsOn ("lifecycleBeanPostProcessor")
public Realm realmLocal() {
return new AuthorizingRealm() {
@Override
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {
return null;
}
@Override
protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken) throws AuthenticationException {
return null;
}
};
}
@Bean (name = "lifecycleBeanPostProcessor")
public LifecycleBeanPostProcessor lifecycleBeanPostProcessor() {
return new LifecycleBeanPostProcessor();
}
@Bean
public org.apache.shiro.mgt.SecurityManager getSecurityManager() {
DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();
securityManager.setRealm(realmLocal());
return securityManager;
}
@DependsOn("lifecycleBeanPostProcessor")
@Bean
public DefaultAdvisorAutoProxyCreator defaultAdvisorAutoProxyCreator() {
DefaultAdvisorAutoProxyCreator proxyCreator = new DefaultAdvisorAutoProxyCreator();
proxyCreator.setProxyTargetClass(true);
return proxyCreator;
}
// enable shiro annotations
@Bean
public AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor() {
AuthorizationAttributeSourceAdvisor advisor = new AuthorizationAttributeSourceAdvisor();
advisor.setSecurityManager(getSecurityManager());
return advisor;
}
@Bean (name = "shiroFilter")
public ShiroFilterFactoryBean getShiroFilter() {
ShiroFilterFactoryBean shiroFilter = new ShiroFilterFactoryBean();
shiroFilter.setSecurityManager(getSecurityManager());
Map<String, String> filters = new ConcurrentHashMap<>();
filters.put("/**", "authcBasic");
shiroFilter.setFilterChainDefinitionMap(filters);
return shiroFilter;
}
}
当我使用 @RequiresUser 构建这样的端点并在初始化程序中的 AuthorizingRealm 中设置断点时,似乎没有任何反应,并且消息显示没有启动任何 authc/authz 功能:
@RestController
@RequestMapping (value = "/")
@RequiresUser
public class RootEndpoint {
@RequestMapping (method = RequestMethod.GET)
public String doGet() throws Exception {
return "{ \"hello\": \"world\" }";
}
}
这是我的问题
- Q1 我的配置中缺少什么?请记住,如果可能,我会尽量避免使用 XML 配置。
-
Q2 掌握了基础知识后,我可以用什么来抛出异常而不是将用户重定向到另一个页面?我需要自己的自定义
ShiroFilterFactoryBean吗?
【问题讨论】:
标签: spring-mvc shiro spring-4