springboot结合shiro入门学习(二)

上一篇简单学习shiro的认证。这一篇主要是结合数据库来整合springboot和shiro

整体项目结构
在这里插入图片描述

首先我们在pom添加mybatis

 <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>2.1.0</version>
        </dependency>
        

整体pom.xml

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

        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

        <!-- shiro与spring整合依赖 -->
        <dependency>
            <groupId>org.apache.shiro</groupId>
            <artifactId>shiro-spring</artifactId>
            <version>1.4.0</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-thymeleaf</artifactId>
        </dependency>
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>2.1.0</version>
        </dependency>

    </dependencies>
        

UserMapper

//@Mapper
@Repository
public interface UserMapper {
    //登录

    public User findByUsername(String username);
   public int register(User user);
}

UserMapper.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.example.mapper.UserMapper">
    <select id="findByUsername"   parameterType="String" resultType="com.example.pojo.User" >
    select username,password from t_login where username = #{value}
  </select>

    <!-- 添加用户 -->
    <insert id="register" parameterType="com.example.pojo.User">
		INSERT INTO t_login
			(
			username,
			password
			)
			VALUES
			(
			#{username},
			#{password}
			)
	</insert>
</mapper>

UserService

public interface UserService {

    public User findByUsername(String username);
    public boolean register(User user);
}


@Service
public class UserServiceImpl implements UserService {
    //属性注入
    @Autowired
    private UserMapper usermapper;
    public User findByUsername(String username){
        return usermapper.findByUsername(username);
    }

    @Override
    public boolean register(User user) {
         int appregister=0;
       appregister= usermapper.register(user);
      // System.out.println("appregister:"+appregister);
       if(appregister==0){
           return  false;
       }
       else {
           return true;
       }
    }
}

自定义Realm类

/**
 * 自定义Realm
 * 
 *
 */
public class UserRealm extends AuthorizingRealm{
    /**
     * 执行授权逻辑
     */
    @Override
    protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection arg0) {
        System.out.println("执行授权逻辑");
        return null;
    }

    @Autowired
    private UserService userSerivce;
    /**
     * 执行认证逻辑
     */
    @Override
    protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken arg0) throws AuthenticationException {
        System.out.println("执行认证逻辑");

        //编写shiro判断逻辑,判断用户名和密码
        //1.判断用户名
        UsernamePasswordToken token = (UsernamePasswordToken)arg0;

        User user = userSerivce.findByUsername(token.getUsername());

        if(user==null){
            //用户名不存在
            return null;//shiro底层会抛出UnKnowAccountException
        }

        //2.判断密码


        return new SimpleAuthenticationInfo("",user.getPassword(),"");
    }



controller

@Controller
public class UserController {

    @Autowired
    private UserService userService;
    @RequestMapping("/tologin")
    public String tologin(){
        return "login";
    }
    @RequestMapping("/registe")
    public String register(){
        return "registe";
    }

    @RequestMapping("/towelcome")
    public String inwelcome(){
        return "welcome";
    }
    /**
     * 登录逻辑处理
     */
    @RequestMapping("/loginsubmit")
    public String login(String username,String password,Model model){
        /**
         * 使用Shiro编写认证操作
         */
        //1.获取Subject
        Subject subject = SecurityUtils.getSubject();

        //2.封装用户数据
        UsernamePasswordToken token = new UsernamePasswordToken(username,password);

        //3.执行登录方法
        try {
            subject.login(token);

            //登录成功
            //跳转到test.html
            return "redirect:/towelcome";
        } catch (UnknownAccountException e) {
            //e.printStackTrace();
            //登录失败:用户名不存在
            model.addAttribute("msg", "用户名不存在");
            return "login";
        }catch (IncorrectCredentialsException e) {
            //e.printStackTrace();
            //登录失败:密码错误
            model.addAttribute("msg", "密码错误");
            return "login";
        }
    }
    /**
     * 注册逻辑处理
     */
    @RequestMapping("/userRegister")
    public String toregister(String username,String password,Model model)
    {

        User user=new User();
        user.setUsername(username);
        user.setPassword(password);
       boolean addregister= userService.register(user);
       if(addregister) {
           model.addAttribute("msg", "注册成功");
       }
       else{
           model.addAttribute("msg", "注册失败");
       }
        return "registe";
    }

}



ExampleApplication


@MapperScan("com.example.mapper")
@SpringBootApplication
@EnableTransactionManagement//启注解事务管理,等同于xml配置方式的 <tx:annotation-driven />
public class ExampleApplication {

    public static void main(String[] args) {
        SpringApplication.run(ExampleApplication.class, args);
    }

}


**Shiro配置类(*)**基本上跟上一篇一样,就增加了注册认证 filterMap.put("/userRegister", “anon”);

@Configuration
public class ShiroConfig {

    /**
     * 创建ShiroFilterFactoryBean
     */
    @Bean
    public ShiroFilterFactoryBean getShiroFilterFactoryBean(@Qualifier("securityManager")DefaultWebSecurityManager securityManager){
        ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean();

        //设置安全管理器
        shiroFilterFactoryBean.setSecurityManager(securityManager);

        //添加Shiro内置过滤器
        /**
         * Shiro内置过滤器,可以实现权限相关的拦截器
         *    常用的过滤器:
         *       anon: 无需认证(登录)可以访问
         *       authc: 必须认证才可以访问
         *       user: 如果使用rememberMe的功能可以直接访问
         *       perms: 该资源必须得到资源权限才可以访问
         *       role: 该资源必须得到角色权限才可以访问
         */
        Map<String,String> filterMap = new LinkedHashMap<String,String>();

        filterMap.put("/static/**", "anon");
        filterMap.put("/tologin", "anon");
        filterMap.put("/loginsubmit", "anon");
        filterMap.put("/registe", "anon");
        filterMap.put("/userRegister", "anon");
        filterMap.put("/*", "authc");

        //修改调整的登录页面
        shiroFilterFactoryBean.setLoginUrl("/tologin");

        shiroFilterFactoryBean.setFilterChainDefinitionMap(filterMap);


        return shiroFilterFactoryBean;
    }

    /**
     * 创建DefaultWebSecurityManager
     */
    @Bean(name="securityManager")
    public DefaultWebSecurityManager getDefaultWebSecurityManager(@Qualifier("userRealm")UserRealm userRealm){
        DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();
        //关联realm
        securityManager.setRealm(userRealm);
        return securityManager;
    }

    /**
     * 创建Realm
     */
    @Bean(name="userRealm")
    public UserRealm getRealm(){
        return new UserRealm();
    }
}

好了到这里就完成与数据库的整合,下一篇会介绍shiro权限管理和加密认证的过程。
源码地址:https://gitee.com/jzzhu123456/shiroHouse_asd
下一篇:springboot结合shiro入门学习(三)

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Shiro 是 Apache 软件基金会的一个开源安全框架,提供了一整套安全管理的解决方案,包括认证、授权、加密和会话管理等功能。Shiro 的目标在于提供简单易用的 API,同时支持高度定制化的需求。 Spring Boot 是一个快速开发的框架,它可以帮助我们快速搭建一个基于 Spring 的应用程序。Spring Boot 的优势在于它内置了很多常用的依赖库和配置,使得开发者可以更加专注于业务逻辑的实现,而不用过多关注底层的配置。 集成 Shiro 和 Spring Boot 可以为我们的应用程序提供强大的安全管理功能,并且可以快速实现这些功能。下面我们将介绍如何在 Spring Boot 中集成 Shiro。 1. 引入 Shiro 依赖 在 pom.xml 文件中添加以下依赖: ``` <dependency> <groupId>org.apache.shiro</groupId> <artifactId>shiro-spring</artifactId> <version>1.4.2</version> </dependency> ``` 这个依赖包含了 Shiro 的核心库以及与 Spring 集成的库。 2. 配置 Shiro 在 Spring Boot 中,我们可以通过在 application.properties 或 application.yml 文件中配置 Shiro。以下是一个示例的 YAML 配置文件: ``` server: port: 8080 spring: datasource: url: jdbc:mysql://localhost:3306/db?useSSL=false&serverTimezone=UTC username: root password: root shiro: loginUrl: /login successUrl: /index filterChainDefinitions: /index = authc ``` 其中 loginUrl 指定了登录页面的 URL,successUrl 指定了登录成功后跳转的 URL,filterChainDefinitions 指定了 URL 的过滤规则。 3. 编写 Shiro 相关代码 在 Spring Boot 中,我们可以使用 Shiro 的注解来实现对方法或 URL 的权限控制。以下是一个示例代码: ``` @RestController @RequestMapping("/api") public class UserController { @RequiresAuthentication @GetMapping("/user/{id}") public User getUser(@PathVariable Long id) { // ... } @RequiresPermissions("user:create") @PostMapping("/user") public void createUser(@RequestBody User user) { // ... } @RequiresRoles("admin") @DeleteMapping("/user/{id}") public void deleteUser(@PathVariable Long id) { // ... } } ``` 在上面的代码中,@RequiresAuthentication 表示需要认证才能访问该方法,@RequiresPermissions("user:create") 表示需要拥有 user:create 权限才能访问该方法,@RequiresRoles("admin") 表示需要拥有 admin 角色才能访问该方法。 4. 启动应用程序 现在我们可以启动应用程序并访问相应的 URL。如果当前用户没有足够的权限访问某个 URL,Shiro 会自动跳转到登录页面,并在登录成功后重定向到相应的 URL。 总结 通过集成 Shiro 和 Spring Boot,我们可以快速构建一个安全的应用程序。在实际开发中,我们可以根据实际需求来配置 Shiro,例如使用自定义的 Realm、加密算法等。通过合理的配置和使用,我们可以提高应用程序的安全性和可靠性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值