博客
关于我
springboot整合shiro
阅读量:367 次
发布时间:2019-03-04

本文共 10517 字,大约阅读时间需要 35 分钟。

springboot整合shiro

使用
springboot整合shiro其实和使用
SSM整合shiro很相似,只不过使用springboot整合shiro中间简化了很多文件配置,但是主体内容基本一致

1.springboot整合shiro

1.1项目结构图

在这里插入图片描述

1.2访问流程

在这里插入图片描述

1.3项目内容

1.3.1配置类及pom文件

  • 项目启动类
@SpringBootApplication@MapperScan("com.fyx.dao")//包扫描public class Day0408SpringbootApplication {       public static void main(String[] args) {           SpringApplication.run(Day0408SpringbootApplication.class, args);    }}
  • ①首先创建springboot项目,在pom.xml文件中导入相关依赖。
org.springframework.boot
spring-boot-starter-web
com.baomidou
mybatis-plus-boot-starter
3.4.2
com.alibaba
druid-spring-boot-starter
1.1.14
org.apache.shiro
shiro-spring-boot-starter
1.4.1
org.springframework.boot
spring-boot-starter-thymeleaf
com.github.theborakompanioni
thymeleaf-extras-shiro
2.0.0
com.alibaba
fastjson
1.2.62
mysql
mysql-connector-java
5.1.47
org.springframework.boot
spring-boot-configuration-processor
true
org.projectlombok
lombok
true
org.springframework.boot
spring-boot-starter-test
test
  • ②application.properties
# 配置数据源spring.datasource.druid.driver-class-name=com.mysql.jdbc.Driverspring.datasource.druid.url=jdbc:mysql:///shirospring.datasource.druid.username=rootspring.datasource.druid.password=123@qwe
  • shiro的配置文件

在ssm项目中,shiro的组件创建在spring配置文件中,在springboot项目中,需要自己创建一个配置类

ShiroConfig类

@Configuration//等价于spring的配置文件public class ShiroConfig {       //    配置安全管理器    @Bean("securityManager")    public DefaultWebSecurityManager securityManager(Realm myRealm){           DefaultWebSecurityManager securityManager=new DefaultWebSecurityManager();        securityManager.setRealm(myRealm);        return securityManager;    }    //  创建MyRealm对象    @Bean(value = "myRealm")//依赖注入    public Realm getRealm(CredentialsMatcher credentialsMatcher){           MyRealm myRealm = new MyRealm();        myRealm.setCredentialsMatcher(credentialsMatcher);        return myRealm;    }    @Bean(value = "credentialsMatcher")//密码配置器    public CredentialsMatcher getCredentialsMatcher(){           HashedCredentialsMatcher credentialsMatcher = new HashedCredentialsMatcher();        credentialsMatcher.setHashIterations(1024);//散列次数        credentialsMatcher.setHashAlgorithmName("MD5");//使用MD5加密        return credentialsMatcher;    }    //    配置过滤规则    @Bean("shiroFilter")//shiro过滤    public ShiroFilterFactoryBean shiroFilterFactoryBean(DefaultWebSecurityManager securityManager){           ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean();        shiroFilterFactoryBean.setSecurityManager(securityManager);        shiroFilterFactoryBean.setLoginUrl("/tologin");//路径        shiroFilterFactoryBean.setSuccessUrl("/success.html");//访问成功后调转的路径        HashMap
map = new HashMap<>(); map.put("/index.html","anon");// map.put("/static/**","anon"); map.put("/login","anon"); map.put("/**","authc"); shiroFilterFactoryBean.setFilterChainDefinitionMap(map); return shiroFilterFactoryBean; } // 配置过滤器 相当于ssm项目中web.xml的给shiro配置过滤器 @Bean public FilterRegistrationBean filterRegistrationBean(){ FilterRegistrationBean filterRegistrationBean=new FilterRegistrationBean(); filterRegistrationBean.setName("shiroFilter"); filterRegistrationBean.setFilter(new DelegatingFilterProxy()); filterRegistrationBean.addUrlPatterns("/*"); return filterRegistrationBean; } //使shiro标签库可以在thymeleaf中使用 @Bean public ShiroDialect shiroDialect() { return new ShiroDialect(); }}

1.3.2html文件

springboot项目不支持jsp,只能使用html,要使用thymeleaf模板,需要导入依赖

org.springframework.boot
spring-boot-starter-thymeleaf
  • login.html
    
Title
账号:
密码:
  • success.html
    在这个页面中需要使用shiro的标签,要在页面中引入shiro的标签,也要在pom.xml中引入依赖
com.github.theborakompanioni
thymeleaf-extras-shiro
2.0.0
    
成功页面成功

欢迎来到xxx班 尽情欢呼!

查询所有用户
修改用户
删除用户
添加用户
导出用户
  • un.html
    
Title无权访问

1.3.3后端类文件

  • dao层
    ①UserDao
public interface UserDao extends BaseMapper
{ /** * 根据用户id查询该用户具有的权限 * @param userid * @return */ List
findPermissionByUserid(Integer userid);}

②PermissionDao

public interface PermissionDao {       /**     * 根据userid查询用户权限     */    List
findAllPermissionByUserId(Integer userid);}
  • entity层
    User
@Data@AllArgsConstructor@NoArgsConstructorpublic class User {       private Integer userid;    private String username;    private String userpwd;    private String  sex;    private String  address;    private String  salt;//盐}
  • service层
    ①UserService
public interface UserService {       User selectByUsername(String username);}

②UserServiceImpl

@Servicepublic class UserServiceImpl implements UserService {       @Resource    private UserDao userDao;    @Override    public User selectByUsername(String username) {           //条件构造器        QueryWrapper
wrapper = new QueryWrapper<>(); wrapper.eq("username",username);//相当于username=#{username} User user = userDao.selectOne(wrapper); return user; }}
  • user的映射文件
  • Controller层
    ①PageController
@Controllerpublic class PageController {       @GetMapping("tologin")    public String tologin(){           return "login";    }}

②LoginController

@Controllerpublic 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 (Exception e){               return "redirect:/tologin";        }    }}

③UserController

@RestController@RequestMapping("user")public class UserController {       @GetMapping("query")    @RequiresPermissions("user:query")//当前Subject需要拥有某些特定的权限时,才能执行被该注解标注的方法。如果当前Subject不具有这样的权限,则方法不会被执行。    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") //@Transcational    public String export(){           return "user:export";    }}
  • handler层

ExceptionController : 处理异常

@ControllerAdvicepublic class ExceptionController {       @ExceptionHandler(value = AuthorizationException.class)    public String handler(){           return "un";    }}
  • realm层

MyRealm类

public class MyRealm extends AuthorizingRealm {       @Resource    private UserService userService;    @Resource    private PermissionService permissionService;    //授权    @Override    protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {           //查询用户权限信息        User user = (User)principalCollection.getPrimaryPrincipal();        //通过userid查询对应用户所具有的权限        List
userId = permissionService.findAllPermissionByUserId(user.getUserid()); SimpleAuthorizationInfo info = new SimpleAuthorizationInfo(); //判断查询的权限集合是否有值 if (userId.size()>0){ //将权限添加到授权对象中 info.addStringPermissions(userId); } return info; } //认证 @Override protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken) throws AuthenticationException { //获取前台传的用户名 String username = authenticationToken.getPrincipal().toString(); User user = userService.selectByUsername(username); if (user!=null){ ByteSource bytes = ByteSource.Util.bytes(user.getSalt()); SimpleAuthenticationInfo info = new SimpleAuthenticationInfo(user,user.getUserpwd(),bytes,this.getName()); return info; } return null; }}
  • 测试
    在这里插入图片描述
    在这里插入图片描述

2.springboot整合shiro完全分离

前后端完成分离,后端返回给访问者的是json数据

该项目中有三个地方需要改造返回json数据:

1、认证成功或认证失败时
2、出现异常时,例如权限不足时
3、未登录访问时

  • ①创建返回的json数据格式的Result类
@Data@NoArgsConstructor@AllArgsConstructorpublic class Result {       private Integer code;    private String msg;    private Object data;}
  • ②改造Controller

将Controller层的@Controller都改成@RestController,将@ControllerAdvice改成@RestControllerAdvice

LoginController

@PostMapping("login")    public Result login(String username, String userpwd){           Subject subject = SecurityUtils.getSubject();        UsernamePasswordToken token=new UsernamePasswordToken(username,userpwd);        try {               subject.login(token);//realm的认证功能//getPrincipl()可以得到SimpleAuthenticationInfo中的数据            Object user = subject.getPrincipal();            return new Result(2000,"登陆成功",user);        }catch (Exception e){               return new Result(5000,"登陆失败",null);        }    }
  • ②改PageController

PageController

@RestControllerpublic class PageController {       @GetMapping("/tologin")    public Result loginPage(){           return new Result(5002,"请先登录",null);    }}
  • ExceptionController 异常处理类
@RestControllerAdvicepublic class MyHandlerException {       @ExceptionHandler(value = UnauthorizedException.class)    public ResultunauthorizedException(){           return new Result(5001,"权限不足",null);    }}
  • 测试
    在这里插入图片描述
    在这里插入图片描述

转载地址:http://tfzg.baihongyu.com/

你可能感兴趣的文章
Nhibernate的第一个实例
查看>>
NHibernate示例
查看>>
nid修改oracle11gR2数据库名
查看>>
NIFI1.21.0/NIFI1.22.0/NIFI1.24.0/NIFI1.26.0_2024-06-11最新版本安装_采用HTTP方式_搭建集群_实际操作---大数据之Nifi工作笔记0050
查看>>
NIFI1.21.0_java.net.SocketException:_Too many open files 打开的文件太多_实际操作---大数据之Nifi工作笔记0051
查看>>
NIFI1.21.0_Mysql到Mysql增量CDC同步中_日期类型_以及null数据同步处理补充---大数据之Nifi工作笔记0057
查看>>
NIFI1.21.0_Mysql到Mysql增量CDC同步中_补充_插入时如果目标表中已存在该数据则自动改为更新数据_Postgresql_Hbase也适用---大数据之Nifi工作笔记0058
查看>>
NIFI1.21.0_Mysql到Mysql增量CDC同步中_补充_更新时如果目标表中不存在记录就改为插入数据_Postgresql_Hbase也适用---大数据之Nifi工作笔记0059
查看>>
NIFI1.21.0_NIFI和hadoop蹦了_200G集群磁盘又满了_Jps看不到进程了_Unable to write in /tmp. Aborting----大数据之Nifi工作笔记0052
查看>>
NIFI1.21.0_Postgresql和Mysql同时指定库_指定多表_全量同步到Mysql数据库以及Hbase数据库中---大数据之Nifi工作笔记0060
查看>>
NIFI1.21.0最新版本安装_连接phoenix_单机版_Https登录_什么都没改换了最新版本的NIFI可以连接了_气人_实现插入数据到Hbase_实际操作---大数据之Nifi工作笔记0050
查看>>
NIFI1.21.0最新版本安装_配置使用HTTP登录_默认是用HTTPS登录的_Https登录需要输入用户名密码_HTTP不需要---大数据之Nifi工作笔记0051
查看>>
NIFI1.21.0通过Postgresql11的CDC逻辑复制槽实现_指定表多表增量同步_增删改数据分发及删除数据实时同步_通过分页解决变更记录过大问题_02----大数据之Nifi工作笔记0054
查看>>
NIFI1.21.0通过Postgresql11的CDC逻辑复制槽实现_指定表多表增量同步_增加修改实时同步_使用JsonPath及自定义Python脚本_03---大数据之Nifi工作笔记0055
查看>>
NIFI1.21.0通过Postgresql11的CDC逻辑复制槽实现_指定表多表增量同步_插入修改删除增量数据实时同步_通过分页解决变更记录过大问题_01----大数据之Nifi工作笔记0053
查看>>
NIFI1.21.0通过Postgresql11的CDC逻辑复制槽实现_指定表或全表增量同步_实现指定整库同步_或指定数据表同步配置_04---大数据之Nifi工作笔记0056
查看>>
NIFI1.23.2_最新版_性能优化通用_技巧积累_使用NIFI表达式过滤表_随时更新---大数据之Nifi工作笔记0063
查看>>
NIFI从MySql中增量同步数据_通过Mysql的binlog功能_实时同步mysql数据_根据binlog实现update数据实时同步_实际操作05---大数据之Nifi工作笔记0044
查看>>
NIFI从MySql中增量同步数据_通过Mysql的binlog功能_实时同步mysql数据_根据binlog实现数据实时delete同步_实际操作04---大数据之Nifi工作笔记0043
查看>>
NIFI从MySql中增量同步数据_通过Mysql的binlog功能_实时同步mysql数据_配置binlog_使用处理器抓取binlog数据_实际操作01---大数据之Nifi工作笔记0040
查看>>