Spring boot框架第一篇-整合Shiro技术

1.搭建Shiro环境

1-1.JDK环境:JDK1.8+2017版本idea+Mysql数据库

1-2.需要导入的依赖:

整合Mybatis包

<!-- https://mvnrepository.com/artifact/org.mybatis.spring.boot/mybatis-spring-boot-starter -->
		<dependency>
			<groupId>org.mybatis.spring.boot</groupId>
			<artifactId>mybatis-spring-boot-starter</artifactId>
			<version>2.2.1</version>
		</dependency>

整合Shiro包

	<!-- https://mvnrepository.com/artifact/org.apache.shiro/shiro-spring -->
		<dependency>
			<groupId>org.apache.shiro</groupId>
			<artifactId>shiro-spring</artifactId>
			<version>1.8.0</version>
		</dependency>

其他自导包

        <dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-jdbc</artifactId>
		</dependency>
		<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>mysql</groupId>
			<artifactId>mysql-connector-java</artifactId>
			<scope>runtime</scope>
		</dependency>
		<dependency>
			<groupId>org.projectlombok</groupId>
			<artifactId>lombok</artifactId>
			<optional>true</optional>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-test</artifactId>
			<scope>test</scope>
		</dependency>

1-3.前端界面(此处需了解thymeleaf技术)

add.html代码

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
add
</body>
</html>

update.html代码

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
update
</body>
</html>

index.html代码

<!DOCTYPE html>
<html lang="en"  xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
首页
<h4><a th:href="@{/add}">add</a></h4>
<h4><a th:href="@{/update}">update</a></h4>

</body>
</html>

login.html代码(表单可以去bootstrap上去找)

<!DOCTYPE html>
<html lang="en"  xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>

<form class="form-inline" th:action="@{/user/login}">
    <div class="form-group">
        <label for="exampleInputName2">用户名</label>
        <input type="text" th:name="username" class="form-control" id="exampleInputName2" >
    </div>
    <div class="form-group">
        <label for="exampleInputEmail2">密码</label>
        <input type="password" th:name="password" class="form-control" id="exampleInputEmail2" >
    </div>
    <button type="submit" class="btn btn-default">提交</button>
</form>

</body>
</html>

1-4 .YML文件(设置连接数据库资源+整合Mybatis包-映射类,此处注意自己的数据库连接后可能会出错)

spring:
  datasource:
    username: root
    password: 123456
    url: jdbc:mysql://localhost:3306/book
    driver-class-name: com.mysql.cj.jdbc.Driver
mybatis:
      type-aliases-package: com.example.demo.pojo
      mapper-locations: classpath:mapper/*.xml

1-5 .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.demo.Mapper.personMapper">
    <select id="showuser" resultType="Person" parameterType="String">
       select * from t_user WHERE username=#{name}
    </select>
</mapper>

1-6数据库表

 2.编写代码

2.1包结构图

2.2编写Person映射类

package com.example.demo.pojo;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@NoArgsConstructor
@AllArgsConstructor
public class Person {
    //导入了Lombak依赖
    private String username;
    private  String password;
    private  String auth;
}

2.3 编写personMapper接口(注意此接口要用两个注解)

ackage com.example.demo.Mapper;

import com.example.demo.pojo.Person;
import org.apache.ibatis.annotations.Mapper;
import org.springframework.stereotype.Component;
import java.util.List;

@Mapper  //此注解表示mapper需要扫过的类
@Component
public interface personMapper {

    public Person showuser(String name);

}

 2.4编写UserRelam类

package com.example.demo.config;

import com.example.demo.Mapper.personMapper;
import com.example.demo.pojo.Person;
import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authc.*;
import org.apache.shiro.authz.AuthorizationInfo;
import org.apache.shiro.authz.SimpleAuthorizationInfo;
import org.apache.shiro.realm.AuthorizingRealm;
import org.apache.shiro.subject.PrincipalCollection;
import org.apache.shiro.subject.Subject;
import org.springframework.beans.factory.annotation.Autowired;

public class UserRelam extends AuthorizingRealm {
//注入mabatis数据库信息,操作JDBC teamplate中的方法
    @Autowired
    personMapper personmapper;

    @Override
    protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {
        System.out.println ("执行了授权UserRelam方法" );
        //授权操作
        SimpleAuthorizationInfo info = new SimpleAuthorizationInfo ( );
        //通过SecurityUtils拿到当前登录对象
        Subject subject = SecurityUtils.getSubject ( );
        //通过拿到的是Object对象。可以强转
       Person principal = (Person) subject.getPrincipal ( );
        info.addStringPermission ( principal.getAuth () );
        return info;
    }

    @Override
    protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken) throws AuthenticationException {
        System.out.println ("执行了认证UserRelam2方法" );
        /*String username="admin";
        String password="123456";*/
        //封装当前登录对象信息
        UsernamePasswordToken usertoken=(UsernamePasswordToken)authenticationToken;
        //查询数据库信息
        Person showuser = personmapper.showuser ( usertoken.getUsername ( ) );
        System.out.println ( usertoken.getUsername ( ) );
        System.out.println ( showuser );
        if(showuser==null)
        {
            return null;
        }
        //通过pricipal可以拿到认证中的当前对象
        return new SimpleAuthenticationInfo ( showuser,showuser.getPassword (),"" );


}}

2.5编写ShiroConfig类(注意此处的注解)

package com.example.demo.config;

import org.apache.shiro.spring.web.ShiroFilterFactoryBean;
import org.apache.shiro.web.mgt.DefaultWebSecurityManager;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

import java.util.LinkedHashMap;
import java.util.Map;

@Configuration
public class ShiroConfig {
    @Bean
    public ShiroFilterFactoryBean getShiroFilterFactoryBean(@Qualifier("Manager") DefaultWebSecurityManager SecurityManager)
    {
        ShiroFilterFactoryBean bean = new ShiroFilterFactoryBean ( );
        bean.setSecurityManager ( SecurityManager );
        //拦截
        Map<String, String> filterMap=new LinkedHashMap <> ();
        //授权,未授权报401错误,
        //perms[user:add],请详细看quick start shiro
        filterMap.put ( "/add","perms[user:add]" );
        filterMap.put ( "/update","perms[user:update]" );
        bean.setFilterChainDefinitionMap ( filterMap );
        //未授权跳转界面
        bean.setUnauthorizedUrl("/noauth");
        return bean;

    }

    @Bean (name="Manager")
    public DefaultWebSecurityManager getDefaultWebSecurityManager(@Qualifier("userRelam") UserRelam userRelam){
        DefaultWebSecurityManager SecurityManager = new DefaultWebSecurityManager ( );
        SecurityManager.setRealm (userRelam);
        return SecurityManager;

    }
  //自定义了一个UserRelam(可以自己去看看quick start shiro中的例子)
    @Bean
    public UserRelam userRelam()
    {
        return new UserRelam ();
    }

}

2.6编写MyController类

package com.example.demo.controller;

import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authc.IncorrectCredentialsException;
import org.apache.shiro.authc.UnknownAccountException;
import org.apache.shiro.authc.UsernamePasswordToken;
import org.apache.shiro.subject.Subject;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

@Controller
public class MyController {
    @RequestMapping("/index")
    public String show(Model model){
            model.addAttribute ( "msg","错误" );
            return "index";
        }
      @RequestMapping("/add")
        public String add(){
        return "user/add";
        }

    @RequestMapping("/login")
    public  String login()
    {
        return "login";
    }

    @RequestMapping("/update")
        public String update(){
        return "user/update";
        }
         @RequestMapping("/user/login")
        public String login(String username,String password){
             System.out.println ("这里" );
             //获取当前登录用户
             Subject subject = SecurityUtils.getSubject ( );
             //封装用户的数据
             UsernamePasswordToken token = new UsernamePasswordToken ( username, password );
             try{
                 subject.login ( token );
                 return "index";
             }
             catch (UnknownAccountException e){
                 return "login";
             }
             catch (IncorrectCredentialsException e){
                 return  "login";
             }
             }

    @RequestMapping("noauth")  //未授权,跳转界面
    @ResponseBody  //将返回值以json形式返回到界面
    public String noauth()
    {
        return "未经授权,不予访问";
    }
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
Shiro框架Spring Boot整合相对简单,可以通过一些配置和依赖来实现。以下是一个基本的整合示例: 1. 在Spring Boot的pom.xml文件中添加Shiro和Web依赖: ```xml <dependency> <groupId>org.apache.shiro</groupId> <artifactId>shiro-spring-boot-web-starter</artifactId> <version>1.8.0</version> </dependency> <dependency> <groupId>org.apache.shiro</groupId> <artifactId>shiro-ehcache</artifactId> <version>1.8.0</version> </dependency> ``` 2. 创建一个Shiro配置类,用于配置Shiro相关的Bean和过滤器: ```java @Configuration public class ShiroConfig { @Bean public Realm realm() { return new MyRealm(); // 自定义的Realm实现 } @Bean public ShiroFilterFactoryBean shiroFilterFactoryBean(DefaultWebSecurityManager securityManager) { ShiroFilterFactoryBean factoryBean = new ShiroFilterFactoryBean(); factoryBean.setSecurityManager(securityManager); // 配置过滤规则等 // factoryBean.setFilterChainDefinitionMap(...); return factoryBean; } @Bean public DefaultWebSecurityManager securityManager(Realm realm) { DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager(); securityManager.setRealm(realm); return securityManager; } } ``` 3. 创建一个自定义的Realm实现,用于处理身份认证和权限授权逻辑: ```java public class MyRealm extends AuthorizingRealm { @Override protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) { // 处理授权逻辑 return null; } @Override protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException { // 处理认证逻辑 return null; } } ``` 4. 在Spring Boot的application.properties或application.yml文件中配置Shiro相关属性: ```yaml shiro: loginUrl: /login successUrl: /home unauthorizedUrl: /unauthorized ``` 这样,你就完成了Shiro框架Spring Boot整合。你可以根据自己的需求继续配置Shiro的过滤规则、权限配置等。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Amo@骄纵

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值