SpringBoot整合Shiro

SpringBoot整合Shiro

1.导入依赖

<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-thymeleaf</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

        <dependency>
            <groupId>org.apache.shiro</groupId>
            <artifactId>shiro-spring-boot-web-starter</artifactId>
            <version>1.7.0</version>
        </dependency>

2.编写html页面

  1. index.html
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>首页</title>
</head>
<body>
<br>
首页
<p th:text="${msg}"></p>

<a href="/add">add</a>|
<a href="/update">update</a>
</body>
</html>
  1. add.html
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>add</title>
</head>
<body>
add
</body>
</html>
  1. update.html
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>update</title>
</head>
<body>
update
</body>
</html>

3.编写配置文件

  1. ShiroConfig
@Configuration
public class ShiroConfig {


//    ShiroFilterFactoryBean
    @Bean
    public ShiroFilterFactoryBean shiroFilterFactoryBean(@Qualifier("defasultWebSecurityManager") DefaultWebSecurityManager defasultWebSecurityManager){
        ShiroFilterFactoryBean filterFactoryBean = new ShiroFilterFactoryBean();
//        设置安全管理器
        filterFactoryBean.setSecurityManager(defasultWebSecurityManager);

        /**
         * 添加shiro内置过滤器
         * anon:无需认证就可以访问
         * authc:必须认证才可以访问
         * user:必须拥有记住我功能才可以访问
         * perms:拥有对某个资源的权限才可以访问
         * role:拥有某个角色权限才可以访问
         */
        Map<String,String> map = new LinkedHashMap<>();
        map.put("/add","authc");
        map.put("/update","authc");
        filterFactoryBean.setFilterChainDefinitionMap(map);



        //设置登录请求
        filterFactoryBean.setLoginUrl("/toLogin");

        return filterFactoryBean;
    }


//    DefaultWebSecurityManager
    @Bean
    public DefaultWebSecurityManager defasultWebSecurityManager(@Qualifier("userRealm") UserRealm userRealm){
        DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();

        //关联 UserRealm
        securityManager.setRealm(userRealm);


        return securityManager;
    }



//    realm:创建realm需要自定义类

    @Bean
    public UserRealm userRealm(){
        return new UserRealm();
    }


}

2.UserRealm.class

public class UserRealm extends AuthorizingRealm {

//    授权
    @Override
    protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {
        System.out.println("执行了授权");
        return null;
    }

//    认证
    @Override
    protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken) throws AuthenticationException {
        System.out.println("执行了认证");

        //用户名 密码 数据库中取  这里先写死数据方便测试
        String name = "root";
        String password = "123456";

        UsernamePasswordToken usernamePasswordToken = (UsernamePasswordToken) authenticationToken;

        if (!usernamePasswordToken.getUsername().equals(name)){
           return null; //登录失败抛出UnknownAccountException异常
        }

        /**
         * 密码认证由 shiro执行    shiro帮助我们进行密码验证
         */

        return new SimpleAuthenticationInfo("",password,"");
       
    }
}

4.controller

@Controller
public class IndexController {


    @RequestMapping("/index")
    public String toIndex(){

        return "index";
    }

    @RequestMapping("/add")
    public String toAdd(){

        return "user/add";
    }
    @RequestMapping("/update")
    public String toUpdate(){

        return "user/update";
    }

    @RequestMapping("/toLogin")
    public String toLogin(){

        return "login";
    }

    @RequestMapping("/login")
    public String login(String username , String password, Model model){
//        获取当前用户
        Subject subject = SecurityUtils.getSubject();
//          封装用户名密码
        UsernamePasswordToken token = new UsernamePasswordToken(username, password);


        /**
         * 执行登录方法,若没有异常则登录成功
         */


        try{
            subject.login(token);
            return "index";
        }catch (UnknownAccountException e){

            model.addAttribute("msg","用户名错误");
            return "login";
        }catch (IncorrectCredentialsException e){

            model.addAttribute("msg","密码错误");
            return "login";
        }


    }
}

5.启动项目
在这里插入图片描述
在这里插入图片描述

进入首页,点击add或update时会跳转到自定义登录页面(本项目的 /toLogin 请求 )

因为在ShiroConfig类中进行了配置

 /**
         * 添加shiro内置过滤器
         * anon:无需认证就可以访问
         * authc:必须认证才可以访问
         * user:必须拥有记住我功能才可以访问
         * perms:拥有对某个资源的权限才可以访问
         * role:拥有某个角色权限才可以访问
         */
        Map<String,String> map = new LinkedHashMap<>();
        map.put("/add","authc");
        map.put("/update","authc");
        filterFactoryBean.setFilterChainDefinitionMap(map);

登录成功后跳转到index页面(本测试项目跳转到index)

![在这里插入图片描述](https://img-blog.csdnimg.cn/20201116212451730.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3h4eGhk,size_16,color_FFFFFF,t_70#pic_center

SpringBoot整合Shiro,并使用mybatis-plus连接数据库进行登录

1.导入依赖

        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <scope>compile</scope>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-jdbc</artifactId>
        </dependency>

        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>2.2.0</version>
        </dependency>

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        

2.配置application.yml文件

spring:
  thymeleaf:
    mode: HTML
    prefix: classpath:/templates/
    suffix: .html
    servlet:
      content-type: text/html
  datasource:
    url: jdbc:mysql://127.0.0.1:3306/user?autoReconnect=true&useUnicode=true&characterEncoding=utf8&serverTimezone=GMT%2B8
    password: 1234
    username: root
mybatis-plus:
  mapper-locations: classpath:/mapper/xml/*.xml
  type-aliases-package: com.lyb.shiro.po

3.创建数据库在这里插入图片描述

4.创建实体类User.class

@Data
@AllArgsConstructor
@NoArgsConstructor
@TableName(value = "t_user")
public class User {
    private Long id;
    private String username;
    private String password;
}

5.dao接口继承mybatis-plus的 BaseMapper

@Repository
public interface UserDao extends BaseMapper<User> {

}

6.UserService接口

public interface UserService {
    User queryUser(String name);
}

7UserService接口的实现类UserServiceImpl

@Service
public class UserServiceImpl implements UserService {
    @Autowired
    private UserDao userDao;

    @Override
    public User queryUser(String name) {
        User user = new User();
        user.setUsername(name);
        return this.userDao.selectOne(user);
    }
}

7.登录认证都由Shiro的 UserRealm来完成

public class UserRealm extends AuthorizingRealm {

    @Autowired
    UserService userService;


//    授权
    @Override
    protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {
        System.out.println("执行了授权");
        return null;
    }

//    认证
    @Override
    protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken) throws AuthenticationException {
        System.out.println("执行了认证");

        /**
         * 连接数据库
         */

        UsernamePasswordToken usernamePasswordToken = (UsernamePasswordToken) authenticationToken;

        User user = this.userService.queryUser(usernamePasswordToken.getUsername());


        if (user==null){
            return null;  //抛出异常
        }



        /**
         * 密码认证由 shiro执行    shiro帮助我们进行密码验证
         */
        return  new SimpleAuthenticationInfo("",user.getPassword(),"");
    }
}

8.启动项目
在这里插入图片描述

输入用户名错误
在这里插入图片描述

输入密码错误

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值