原生的整合
建立項目
#建立一個Spring Boot 項目,只需要加入Web 依賴:
專案建立成功後,加入Shiro 相關的依賴,完整的pom.xml 檔案中的依賴如下:
<dependencies> <dependency> <groupid>org.springframework.boot</groupid> <artifactid>spring-boot-starter-web</artifactid> </dependency> <dependency> <groupid>org.apache.shiro</groupid> <artifactid>shiro-web</artifactid> <version>1.4.0</version> </dependency> <dependency> <groupid>org.apache.shiro</groupid> <artifactid>shiro-spring</artifactid> <version>1.4.0</version> </dependency> </dependencies>
建立Realm
#接下來我們來自訂核心元件Realm:
public class MyRealm extends AuthorizingRealm { @Override protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) { return null; } @Override protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException { String username = (String) token.getPrincipal(); if (!"javaboy".equals(username)) { throw new UnknownAccountException("账户不存在!"); } return new SimpleAuthenticationInfo(username, "123", getName()); } }
在Realm 中實作簡單的認證操作即可,不做授權,授權的具體寫法和SSM 中的Shiro 一樣,不贅述。這裡的認證表示使用者名稱必須是 javaboy ,使用者密碼必須是 123 ,滿足這樣的條件,就能登入成功!
設定Shiro
接下來進行Shiro 的設定:
@Configuration public class ShiroConfig { @Bean MyRealm myRealm() { return new MyRealm(); } @Bean SecurityManager securityManager() { DefaultWebSecurityManager manager = new DefaultWebSecurityManager(); manager.setRealm(myRealm()); return manager; } @Bean ShiroFilterFactoryBean shiroFilterFactoryBean() { ShiroFilterFactoryBean bean = new ShiroFilterFactoryBean(); bean.setSecurityManager(securityManager()); bean.setLoginUrl("/login"); bean.setSuccessUrl("/index"); bean.setUnauthorizedUrl("/unauthorizedurl"); Map<string> map = new LinkedHashMap(); map.put("/doLogin", "anon"); map.put("/**", "authc"); bean.setFilterChainDefinitionMap(map); return bean; } }</string>
在這裡進行Shiro 的設定主要設定3 個Bean :
首先需要提供一個Realm 的實例。
在設定 Realm 時,需要在 SecurityManager 中設定。
配置一個 ShiroFilterFactoryBean ,在 ShiroFilterFactoryBean 中指定路徑攔截規則等。
設定登入和測試介面。
其中,ShiroFilterFactoryBean 的設定稍微多一些,設定意義如下:
setSecurityManager 表示指定 SecurityManager。
setLoginUrl 表示指定登入頁面。
setSuccessUrl 表示指定登入成功頁面。
接下來的 Map 中配置了路徑攔截規則,注意,要有序。
這些東西都配置完成後,接下來配置登錄Controller:
@RestController public class LoginController { @PostMapping("/doLogin") public void doLogin(String username, String password) { Subject subject = SecurityUtils.getSubject(); try { subject.login(new UsernamePasswordToken(username, password)); System.out.println("登录成功!"); } catch (AuthenticationException e) { e.printStackTrace(); System.out.println("登录失败!"); } } @GetMapping("/hello") public String hello() { return "hello"; } @GetMapping("/login") public String login() { return "please login!"; } }
測試時,首先訪問/hello 接口,由於未登錄,所以會自動跳轉到/login 介面:
然後呼叫/doLogin 介面完成登入:
再次存取/hello 接口,就可以成功存取了:
使用Shiro Starter
上面這種設定方式其實相當於把SSM 中的XML 配置拿到Spring Boot 中用Java 程式碼重新寫了一遍,除了這種方式之外,我們也可以直接使用Shiro 官方提供的Starter 。
創建工程,和上面的一樣
創建成功後,添加 shiro-spring-boot-web-starter
,這個依賴可以取代之前的 shiro -web
和 shiro-spring
兩個依賴,pom.xml 檔案如下:
<dependencies> <dependency> <groupid>org.springframework.boot</groupid> <artifactid>spring-boot-starter-web</artifactid> </dependency> <dependency> <groupid>org.apache.shiro</groupid> <artifactid>shiro-spring-boot-web-starter</artifactid> <version>1.4.0</version> </dependency> </dependencies>
建立Realm
#這裡的Realm 和前面的一樣,我就不再贅述。
設定Shiro 基本資訊
接下來在application.properties 中設定Shiro 的基本資訊:
shiro.sessionManager.sessionIdCookieEnabled=true shiro.sessionManager.sessionIdUrlRewritingEnabled=true shiro.unauthorizedUrl=/unauthorizedurl shiro.web.enabled=true shiro.successUrl=/index shiro.loginUrl=/login
設定解釋:
第一行表示是否允許將sessionId 放到cookie 中
#第二行表示是否允許將sessionId 放到Url 位址攔截中
#第三行表示存取未獲授權的頁面時,預設的跳轉路徑
#第四行表示開啟shiro
第五行表示登入成功的跳轉頁面
第六行表示登入頁面
設定ShiroConfig
@Configuration public class ShiroConfig { @Bean MyRealm myRealm() { return new MyRealm(); } @Bean DefaultWebSecurityManager securityManager() { DefaultWebSecurityManager manager = new DefaultWebSecurityManager(); manager.setRealm(myRealm()); return manager; } @Bean ShiroFilterChainDefinition shiroFilterChainDefinition() { DefaultShiroFilterChainDefinition definition = new DefaultShiroFilterChainDefinition(); definition.addPathDefinition("/doLogin", "anon"); definition.addPathDefinition("/**", "authc"); return definition; } }
以上是SpringBoot中怎麼將Shiro整合的詳細內容。更多資訊請關注PHP中文網其他相關文章!