首頁  >  文章  >  Java  >  SpringBoot中怎麼將Shiro整合

SpringBoot中怎麼將Shiro整合

WBOY
WBOY轉載
2023-05-17 23:01:101067瀏覽

原生的整合

建立項目

#建立一個Spring Boot 項目,只需要加入Web 依賴:

SpringBoot中怎麼將Shiro整合

專案建立成功後,加入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 介面:

SpringBoot中怎麼將Shiro整合

然後呼叫/doLogin 介面完成登入:

SpringBoot中怎麼將Shiro整合

再次存取/hello 接口,就可以成功存取了:

SpringBoot中怎麼將Shiro整合

使用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中文網其他相關文章!

陳述:
本文轉載於:yisu.com。如有侵權,請聯絡admin@php.cn刪除