Shiro

78 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第13天,点击查看活动详情

一.核心组件

  • Subject:主体,代表当前“用户”。它是一个抽象概念,与当前应用交互的任何对象都是 Subject,如网络爬虫,机器人等。所有的Subject都绑定到 SecurityManager,即与Subject的所有交互都会委托给SecurityManager;可以把 Subject 认为是一个门面;SecurityManager 才是实际的执行者;
  • SecurityManager:安全管理器,是 Shiro 框架的核心组件。它负责与其他组件进行交互,即所有与安全有关的操作都会由SecurityManager负责;
  • Realm:域,可以把 Realm 看成 DataSource,即安全数据源。Shiro从Realm中获取安全数据(如用户、角色、权限)。当 SecurityManager 要验证用 身份时,需要从 Realm 中获取相应的用户,进行比较以确定用户身份是否合法;也需要从Realm中得到用户相应的角色/权限进行验证用户是否能进行操作。

image.png

二.UserController

@RestController
public class UserController {

    @Autowired
    UserService userService;

    /**
     * 使用shiro进行登录校验
     * url:http://localhost/login
     */
    @PostMapping("/login")
    public String login(String username,String password){
        System.out.println(username);
        //1.获取当前的 Subject. 调用 SecurityUtils.getSubject();
        Subject subject = SecurityUtils.getSubject();

        //2.创建登录令牌,存储了用户名和密码,这个token是shiro创建的,也可以使用 jwt token
        UsernamePasswordToken token = new UsernamePasswordToken(username,password);
        System.out.println("token:"+token);

        //3.登录判断
        try {
            // 3.1调用shiro的login方法进行登录判断
            subject.login(token);
            //3.2 将用户名写入session
            Session session = subject.getSession();
            session.setAttribute("shiro:token", token);
            return "登录成功";
        } catch (Exception  e) {
            return "账号出错或密码出错";
        }
    }

}

@RestController
public class UserController {

    @Autowired
    UserService userService;

    /**
     * 使用shiro进行登录校验
     * url:http://localhost/login
     */
    @PostMapping("/login")
    public String login(String username,String password){
        System.out.println(username);
        //1.获取当前的 Subject. 调用 SecurityUtils.getSubject();
        Subject subject = SecurityUtils.getSubject();

        //2.创建登录令牌,存储了用户名和密码,这个token是shiro创建的,也可以使用 jwt token
        UsernamePasswordToken token = new UsernamePasswordToken(username,password);
        System.out.println("token:"+token);

        //3.登录判断
        try {
            // 3.1调用shiro的login方法进行登录判断
            subject.login(token);
            //3.2 将用户名写入session
            Session session = subject.getSession();
            session.setAttribute("shiro:token", token);
            return "登录成功";
        } catch (Exception  e) {
            return "账号出错或密码出错";
        }
    }

}

三.引入依赖

在pom.xml文件里引入

<!--        shiro依赖 -->
        <dependency>
            <groupId>org.apache.shiro</groupId>
            <artifactId>shiro-spring</artifactId>
            <version>1.4.1</version>
        </dependency>