整合Shiro第一种方式

导入依赖

<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>

创建MyRealm类并继承AuthorizingRealm在Realm中实现简单的认证操作即可,不做授权

public class MyRealm extends AuthorizingRealm {
    @Override
    protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {
        return null;
    }

    @Override
    protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
        String username = (String) token.getPrincipal();
        if("admin".equals(username)){
            //getName()是MyRealm的实例数量
            return new SimpleAuthenticationInfo(username,"123",getName());
        }
        return null;
    }
}

创建ShiroConfig

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

首先需要提供一个Realm 的实例。

需要配置一个SecurityManager,在 SecurityManager 中配置 Realm。

配置一个ShiroFilterFactoryBean ,在 ShiroFilterFactoryBean 中指定路径拦截规则等。

配置登录和测试接口。

其中,ShiroFilterFactoryBean的配置稍微多一些,配置含义如下:

setSecurityManager 表示指定 SecurityManager。

setLoginUrl表示指定登录页面。

setSuccessUrl表示指定登录成功页面。

接下来的 Map中配置了路径拦截规则,注意,要有序。

@Configuration
public class ShiroConfig {
    @Bean
    MyRealm myRealm() {
        return new MyRealm();
    }

    @Bean
    SecurityManager securityManager(){
        DefaultWebSecurityManager defaultWebSecurityManager = new DefaultWebSecurityManager();
        defaultWebSecurityManager.setRealm(myRealm());
        return defaultWebSecurityManager;
    }

    @Bean
    ShiroFilterFactoryBean shiroFilterFactoryBean(){
        ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean();
        shiroFilterFactoryBean.setSecurityManager(securityManager());
        shiroFilterFactoryBean.setLoginUrl("/login");
        shiroFilterFactoryBean.setSuccessUrl("/welcome");
        Map<String,String> map = new LinkedHashMap<>();
        //登录地址匿名访问
        map.put("/dologin","anon");
        //剩下的地址,认证后访问
        map.put("/**", "authc");
        //自定义拦截规则
        shiroFilterFactoryBean.setFilterChainDefinitionMap(map);
        return shiroFilterFactoryBean;
    }
}

创建Controller用来测试

@RestController
public class HelloController {
    @GetMapping("/login")
    public String login() {
        return "please login";
    }

    @PostMapping("/dologin")
    public String dologin(String username,String password) {
        Subject subject = SecurityUtils.getSubject();
        try {
            subject.login(new UsernamePasswordToken(username,password));
            return "success";
        } catch (AuthenticationException e) {
            e.printStackTrace();
            return e.getMessage();

        }
    }

    @GetMapping("/welcome")
    public String hello(){
        return "hello";
    }
}

效果图

posted @ 2020-08-06 16:14  柒丶月  阅读(99)  评论(0编辑  收藏  举报