此文章僅僅說明在springboot整合shiro時的一些坑,並非教程html
增長依賴web
<!-- 集成shiro依賴 --> <dependency> <groupId>org.apache.shiro</groupId> <artifactId>shiro-spring-boot-web-starter</artifactId> <version>1.4.0-RC2</version> </dependency>
配置三個必須的Beanspring
@Bean public Realm realm() { //建立本身的Realm實例 return new UserRealm(); }
DefaultShiroFilterChainDefinition chainDefinition = new DefaultShiroFilterChainDefinition(); // 三種方式實現定義權限路徑 // 第一種:使用角色名定義 chainDefinition.addPathDefinition("/admin/**", "authc, roles[admin]"); // 第二種:使用權限code定義 chainDefinition.addPathDefinition("/docs/**", "authc, perms[document:read]"); // 第三種:使用接口的自定義配置(此處配置以後須要在對應的接口使用@RequiresPermissions("")) chainDefinition.addPathDefinition("/**", "authc"); return chainDefinition;
@Bean protected CacheManager cacheManager() { return new MemoryConstrainedCacheManager(); }
還有一些配置,能夠在配置文件中配置,具體配置項見 shiro配置apache
如下內容是爲了實現先後端分離,配置shiro攔截器實現返回401狀態碼的需求後端
編寫攔截器類緩存
public class FormLoginFilter extends PathMatchingFilter { @Override protected boolean onPreHandle(ServletRequest request, ServletResponse response, Object mappedValue) throws Exception { Subject subject = SecurityUtils.getSubject(); boolean isAuthenticated = subject.isAuthenticated(); if (!isAuthenticated) { HttpServletResponse resp = (HttpServletResponse) response; resp.setStatus(HttpServletResponse.SC_UNAUTHORIZED); resp.getWriter().print("NO AUTH!"); return false; } return true; } }
在以前配置的三個Bean的基礎上多配置一個BeanShiroFilterFactoryBean
springboot
@Bean public ShiroFilterFactoryBean shiroFilter(SecurityManager securityManager) { ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean(); // 必須設置SecuritManager shiroFilterFactoryBean.setSecurityManager(securityManager); Map<String, Filter> filters = shiroFilterFactoryBean.getFilters(); //配置攔截器,實現無權限返回401,而不是跳轉到登陸頁 filters.put("authc", new FormLoginFilter()); // 若是不設置默認會自動尋找Web工程根目錄下的"/login.jsp"頁面 shiroFilterFactoryBean.setLoginUrl("/login"); // 登陸成功後要跳轉的連接 shiroFilterFactoryBean.setSuccessUrl("/index"); // 未受權界面; shiroFilterFactoryBean.setUnauthorizedUrl("/403"); // 攔截器 Map<String, String> filterChainDefinitionMap = new LinkedHashMap<String, String>(); // 過濾鏈定義,從上向下順序執行,通常將 /**放在最爲下邊 // authc:全部url都必須認證經過才能夠訪問; anon:全部url都均可以匿名訪問 filterChainDefinitionMap.put("/**", "authc"); shiroFilterFactoryBean.setFilterChainDefinitionMap(filterChainDefinitionMap); return shiroFilterFactoryBean; }
此處配置了過濾鏈,上面三個必須的Bean中修改其中的ShiroFilterChainDefinition
app
@Bean public ShiroFilterChainDefinition shiroFilterChainDefinition() { //不須要在此處配置權限頁面,由於上面的ShiroFilterFactoryBean已經配置過,可是此處必須存在,由於shiro-spring-boot-web-starter或查找此Bean,沒有會報錯 return new DefaultShiroFilterChainDefinition();; }