Spring Boot整合shiro(eclipse版)

在 Spring Boot 中做权限管理,一般来说,主流的方案是 Spring Security ,但是,仅仅从技术角度来说,也可以使用 Shiro。

在 Spring Boot 中整合 Shiro ,有两种不同的方案:

  1. 第一种就是原封不动的,将 SSM 整合 Shiro 的配置用 Java 重写一遍。
  2. 第二种就是使用 Shiro 官方提供的一个 Starter 来配置,但是,这个 Starter 并没有简化多少配置。

这里演示第二种,因之后大多数都是用注解来进行开发

1、创建spring Boot工程

导入依赖

<!--主要的依赖-->
<dependency>
    <groupId>org.apache.shiro</groupId>
    <artifactId>shiro-spring-boot-web-starter</artifactId>
    <version>1.5.3</version>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>

2、创建Realm

定义我们自己的Realm

public class ShiroRealm extends AuthorizingRealm{

    @Override
    protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {
        // TODO Auto-generated method stub
        return null;
    }
    @Override
    protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
        String username = (String) token.getPrincipal();
        if(!"xiaobear".equals(username)) {
            throw new org.apache.shiro.authc.UnknownAccountException("用户名不存在!");
        }
        return new org.apache.shiro.authc.SimpleAuthenticationInfo(username,"123456",getName());
    }
}

在 Realm 中实现简单的认证操作即可,不做授权,授权的具体写法和 SSM 中的 Shiro 一样,不赘述。这里的认证表示用户名必须是xiaobear,用户密码必须是123456 ,满足这样的条件,就能登录成功!

3、配置Shiro

@Configuration
public class ShiroConfig {

	@Bean
	ShiroRealm shiroRealm() {
		return new ShiroRealm();
	}
	@Bean
	DefaultWebSecurityManager securityManager() {
		DefaultWebSecurityManager defaultWebSecurityManager = new DefaultWebSecurityManager();
		defaultWebSecurityManager.setRealm(shiroRealm());
		return defaultWebSecurityManager;
	}
	@Bean
	ShiroFilterChainDefinition shiroFilterChainDefinition() {
		DefaultShiroFilterChainDefinition defaultShiroFilterChainDefinition = new DefaultShiroFilterChainDefinition();
		defaultShiroFilterChainDefinition.addPathDefinition("/login", "anon");
		defaultShiroFilterChainDefinition.addPathDefinition("/**", "authc");
		return defaultShiroFilterChainDefinition;
	}
}

在这里进行 Shiro 的配置主要配置 3 个 Bean :

  1. 首先需要提供一个 Realm 的实例。
  2. 需要配置一个 DefaultWebSecurityManager,在 SecurityManager 中配置 Realm。
  3. 配置一个ShiroFilterChainDefinition ,在 ShiroFilterChainDefinition 中指定路径拦截规则等。
  4. 配置登录和测试接口。

4、配置Shiro的基本信息

shiro:
  sessionManager:
    sessionIdCookieEnabled: true
    sessionIdUrlRewritingEnabled: true
  loginUrl: /login
  successUrl: /index
  unauthorizedUrl: /unauthorized
  web:
    enabled: true
  • sessionIdCookieEnabled:表示是否允许将sessionId 放到 cookie 中
  • sessionIdUrlRewritingEnabled:表示是否允许将 sessionId 放到 Url 地址拦中
  • loginUrl:表示登录页面
  • successUrl:表示登录成功的跳转页面
  • unauthorizedUrl:表示访问未获授权的页面时,默认的跳转路径
  • web:
    enabled:表示开启 shiro

5、Controller

@RestController
public class LoginController {

	@PostMapping("/login")
	public void login(String username,String password) {
		Subject subject = SecurityUtils.getSubject();
		try {
			subject.login(new org.apache.shiro.authc.UsernamePasswordToken(username, password));
			System.out.println("登录成功!");
		} catch (AuthenticationException e) {
			e.printStackTrace();
			System.out.println("登录失败!");
		}
	}
	@GetMapping("/hello")
    public String hello() {
        return "hello";
    }
    @GetMapping("/tologin")
    public String login() {
        return "please login!";
    }

}

6、遇到的错误

1、There is no filter with name ‘anno’ to apply to chain

解决办法:无访问权限直接访问的配置不是“anno”而是“anon”

@Bean
	ShiroFilterChainDefinition shiroFilterChainDefinition() {
		DefaultShiroFilterChainDefinition defaultShiroFilterChainDefinition = new DefaultShiroFilterChainDefinition();
		defaultShiroFilterChainDefinition.addPathDefinition("/login", "anon");
		defaultShiroFilterChainDefinition.addPathDefinition("/**", "authc");
		return defaultShiroFilterChainDefinition;
	}

2、(No bean of type ‘org.apache.shiro.realm.Realm’ found),Spring Boot不自动载入配置

解决办法:

  • 首先检查自己是否在配置类上有@Configuration

  • 其次是否有@Bean注解

  • 网上教程说排除三个类就可以了,但这个我没遇到过,仅供参考

    @SpringBootApplication(exclude = {ShiroAnnotationProcessorAutoConfiguration.class, ShiroAutoConfiguration.class, ShiroBeanAutoConfiguration.class})
    
posted on 2022-09-06 09:02  小熊学Java  阅读(191)  评论(0编辑  收藏  举报