springboot整合shiro(用的mybatis-plus)

工程结构
在这里插入图片描述

1.在pom.xml中引入jar

 <!--druid jar-->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid-spring-boot-starter</artifactId>
            <version>1.1.21</version>
        </dependency>

        <!--springboot 整合mybatis-plus-->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.4.1</version>
        </dependency>

        <!--springboot 整合shiro-->
        <dependency>
            <groupId>org.apache.shiro</groupId>
            <artifactId>shiro-spring-boot-starter</artifactId>
            <version>1.7.0</version>
        </dependency>

        <!--lombook-->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>

        <!--加入 thymeleaf模板-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-thymeleaf</artifactId>
        </dependency>

        <!--使用shiro标签库-->
        <dependency>
            <groupId>com.github.theborakompanioni</groupId>
            <artifactId>thymeleaf-extras-shiro</artifactId>
            <version>2.0.0</version>
        </dependency>

2.application.properties

#数据源
spring.datasource.druid.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.druid.url=jdbc:mysql://localhost:3306/shiro?serverTimezone=Asia/Shanghai&characterEncoding=UTF8
spring.datasource.druid.username=root
spring.datasource.druid.password=654123

#日志
logging.level.com.ganin.dao=debug

3.dao,entity,service,controller…

entity:

@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {
    private Integer userid;
    private String username;
    private String userpwd;
    private String sex;
    private String address;
    private String salt;//加盐
}

dao

//用mybatis-plus 必须继承BaseMapper
public interface UserDao extends BaseMapper<User> {
}
    /**
     * 根据id找权限
     * @param userid
     * @return
     */
    public List<String> findPermissionByUserId(Integer userid);

service

public interface UserService {
    /**
     * 根据用户名找权限
     * @param username
     * @return
     */

    public User findUserByUserName(String username);
}

@Service
public class UserServiceImpl implements UserService {

    @Resource
    private UserDao userDao;

    @Override
    public User findUserByUserName(String username) {
        QueryWrapper<User> wrapper = new QueryWrapper<>();
        wrapper.eq("username",username);
        User user = userDao.selectOne(wrapper);
        return user;

    }
}
public interface PermissionService {

    /**
     * 根据id找权限
     * @param userid
     * @return
     */
    public List<String> queryPermissionByUserId(Integer userid);
}
@Service
public class PermissionServiceImpl implements PermissionService {

    @Resource
    private PermissionDao permissionDao;

    @Override
    public List<String> queryPermissionByUserId(Integer userid) {
        List<String> permission = permissionDao.findPermissionByUserId(userid);
        return permission;
    }
}
<mapper namespace="com.ganin.dao.PermissionDao">


    <select id="findPermissionByUserId" resultType="java.lang.String">
         select percode from user_role ur,
         role_permission rp,
         permission p
         where ur.roleid=rp.roleid and
         rp.perid=p.perid and
         ur.userid=#{userid}
    </select>
</mapper>

controller

@Controller
public class LoginController {

    @PostMapping("/login")
    public String login(String username,String userpwd){
        Subject subject = SecurityUtils.getSubject();
        UsernamePasswordToken token = new UsernamePasswordToken(username, userpwd);
        try {
            subject.login(token);
            return "success";
        } catch (AuthenticationException e) {
            return "login";
        }
    }
}
@Controller
public class PageController {

    @GetMapping("tologin")
    public String tologin(){
        return "login";
    }
}
@RestController
@RequestMapping("/user")
public class UserController {

    @GetMapping("/query")
    @RequiresPermissions("user:query")
    public String query(){
        return "user:query";
    }
    @GetMapping("/delete")
    @RequiresPermissions("user:delete")
    public String delete(){
        return "user:delete";
    }
    @GetMapping("/update")
    @RequiresPermissions("user:update")
    public String update(){
        return "user:update";
    }
    @GetMapping("/insert")
    @RequiresPermissions("user:insert")
    public String insert(){
        return "user:insert";
    }
    @GetMapping("/export")
    @RequiresPermissions("user:export")
    public String export(){
        return "user:export";
    }

}

html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<h1>登陆页码</h1>
    <form action="/login" method="post">
        账号:<input type="text" name="username"/><br>
        密码:<input type="text" name="userpwd"/><br>
        <input type="submit" value="登陆"/>
        <input type="button" value="注册" onclick="location.href='regist'"/>
    </form>
</body>
</html>
<!DOCTYPE html>
<html lang="en" xmlns:shiro="http://www.pollix.at/thymeleaf/shiro">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<h2>成功!!!</h2>
<shiro:hasPermission name="user:query">
    <a href="/user/query" >查询所有的用户</a>
</shiro:hasPermission>

<shiro:hasPermission name="user:delete">
    <a href="/user/delete" >删除用户</a>
</shiro:hasPermission>

<shiro:hasPermission name="user:insert">
    <a href="/user/insert" >插入用户</a>
</shiro:hasPermission>

<shiro:hasPermission name="user:update">
    <a href="/user/update" >更新用户</a>
</shiro:hasPermission>

<shiro:hasPermission name="user:export">
    <a href="/user/export" >导出用户</a>
</shiro:hasPermission>
</body>
</html>
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
无权限 damn
</body>
</html>

tips:默认thymeleaf不支持shiro标签库。使用如下方式来解决

<!--thymeleaf支持shiro的依赖-->
<dependency>
            <groupId>com.github.theborakompanioni</groupId>
            <artifactId>thymeleaf-extras-shiro</artifactId>
            <version>2.0.0</version>
        </dependency>
 //使shiro标签库可以在thymeleaf中使用(自己定义的配置文件中加)
    @Bean
    public ShiroDialect shiroDialect() {
        return new ShiroDialect();
    }

4.整合shiro

@Configuration
public class ConfigClassHHH {

    /*安全管理*/
    @Bean("securityManager")                         //安全管理
    public DefaultWebSecurityManager securityManager(MyRealm myRealm){
        DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();
        securityManager.setRealm(myRealm);
        return securityManager;
    }

    @Bean("myRealm")          //密码匹配器
    public MyRealm myRealm(CredentialsMatcher credentialsMatcher){
        MyRealm myRealm = new MyRealm();
        myRealm.setCredentialsMatcher(credentialsMatcher);
        return myRealm;
    }

    @Bean("credentialsMatcher")
    public CredentialsMatcher credentialsMatcher(){
        HashedCredentialsMatcher matcher = new HashedCredentialsMatcher();
        matcher.setHashAlgorithmName("MD5");
        matcher.setHashIterations(1024);
        return matcher;
    }


    /*过滤规则*/
    @Bean("shiroFilterFactoryBean")
    public ShiroFilterFactoryBean shiroFilterFactoryBean(SecurityManager securityManager){
        ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean();
        shiroFilterFactoryBean.setSecurityManager(securityManager);

        shiroFilterFactoryBean.setLoginUrl("/tologin"); //未认证返回的界面
        shiroFilterFactoryBean.setSuccessUrl("/success.html");  //认证成功后返回


        HashMap<String, String> map = new HashMap<>();
        map.put("/login","anon"); //匿名访问
        map.put("/static/**","anon");
        map.put("/**","authc");

        shiroFilterFactoryBean.setFilterChainDefinitionMap(map);

        return shiroFilterFactoryBean;

    }
    //使shiro标签库可以在thymeleaf中使用
    @Bean
    public ShiroDialect shiroDialect() {
        return new ShiroDialect();
    }

}

测试:
在这里插入图片描述在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
springboot:是一个基于Java开发的框架,简化了Spring应用的初始化配置和部署过程。它提供了一套开发规范和约定,帮助开发人员快速搭建高效稳定的应用程序。 mybatis-plus:是基于MyBatis的增强工具,提供了一些便捷的CRUD操作方法和代码生成功能,简化了数据库操作的开发工作。它能够轻松集成到SpringBoot应用中,提高开发效率。 springmvc:是一种基于MVC设计模式的Web框架,用于构建Web应用程序。它能够从URL中解析请求参数,并将请求分发给对应的Controller进行处理。SpringMVC提供了一套灵活的配置和注解方式,支持RESTful风格的API开发。 shiro:是一种用于身份验证和授权的框架,可以集成到SpringBoot应用中。它提供了一套简单易用的API,可以处理用户认证、角色授权、会话管理等安全相关的功能。Shiro还支持集成其他认证方式,如LDAP、OAuth等。 redis:是一种开源的内存数据库,采用键值对存储数据。Redis具有高性能、高并发和持久化等特点,常用于缓存、消息队列和分布式锁等场景。在企业级报表后台管理系统中,可以使用Redis来进行缓存数据,提高系统的响应速度和性能。 企业级报表后台管理系统:是一种用于统一管理和生成报表的系统。它通常包括用户权限管理、报表设计、报表生成、数据分析等功能。使用SpringBootMyBatis-Plus、SpringMVC、Shiro和Redis等技术,可以快速搭建一个可靠、高效的报表管理系统,满足企业对数据分析和决策的需求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值