直接贴上代码

1. 所需要的jar包

        <dependency>
<groupId>org.apache.shiro</groupId>
<artifactId>shiro-core</artifactId>
<version>1.4.0</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.apache.shiro</groupId>
<artifactId>shiro-spring</artifactId>
<version>1.4.0</version>
</dependency>
<dependency>
<groupId>org.apache.shiro</groupId>
<artifactId>shiro-web</artifactId>
<version>1.4.0</version>
</dependency>
<dependency>
<groupId>org.apache.shiro</groupId>
<artifactId>shiro-ehcache</artifactId>
<version>1.4.0</version>
</dependency>

2. 所需要的Configuration

/**
* Shiro的配置文件
*/
@Configuration
public class ShiroConfig {
/**
* 自定义Realm,可以多个
*/
@Bean
public ShiroRealm myRealm(){
ShiroRealm shiroRealm = new ShiroRealm();
return shiroRealm;
}
@Bean
public SessionManager sessionManager() {
DefaultWebSessionManager sessionManager = new DefaultWebSessionManager();
// 设置session过期时间为30分钟
sessionManager.setGlobalSessionTimeout(30 * 60 * 1000);
// 设置定时器,检查session时候国企
sessionManager.setSessionValidationSchedulerEnabled(true);
// 去掉shiro登录时url里的JSESSIONID
sessionManager.setSessionIdUrlRewritingEnabled(false);
return sessionManager;
} /**
* SecurityManager 安全管理器;Shiro的核心
*/
@Bean
public SecurityManager securityManager() {
DefaultWebSecurityManager manager = new DefaultWebSecurityManager();
//将session设置到SecurityManager中
manager.setSessionManager(sessionManager());
//将realm设置到SecurityManager中
manager.setRealm(myRealm());
return manager;
} /**
* shiroFilter过滤类
* @return
*/
@Bean
public ShiroFilterFactoryBean shiroFilterFactoryBean() {
ShiroFilterFactoryBean bean = new ShiroFilterFactoryBean();
bean.setSecurityManager(securityManager());
bean.setLoginUrl("/"); // 登录的路径
bean.setSuccessUrl("/success"); // 登录成功后跳转的路径
bean.setUnauthorizedUrl("/403"); // 验证失败后跳转的路径
Map<String, String> map = new LinkedHashMap<>(); map.put("/captcha", "anon");
map.put("/captcha.jpg", "anon");
map.put("/statics/**", "anon");
map.put("/login.html", "anon");
map.put("/favicon.ico", "anon");
map.put("/login", "anon");
map.put("/**", "authc");
map.put("/logout", "logout");
bean.setFilterChainDefinitionMap(map);
return bean;
} /**
* 配置Shiro生命周期处理器
*/
@Bean(name = "lifecycleBeanPostProcessor")
public LifecycleBeanPostProcessor lifecycleBeanPostProcessor() {
return new LifecycleBeanPostProcessor();
} /**
* 自动创建代理类,若不添加,Shiro的注解可能不会生效。
*/
@Bean
@DependsOn({"lifecycleBeanPostProcessor"})
public DefaultAdvisorAutoProxyCreator advisorAutoProxyCreator() {
DefaultAdvisorAutoProxyCreator advisorAutoProxyCreator = new DefaultAdvisorAutoProxyCreator();
advisorAutoProxyCreator.setProxyTargetClass(true);
return advisorAutoProxyCreator;
} /**
* 开启Shiro的注解
*/
@Bean
public AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor() {
AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor = new AuthorizationAttributeSourceAdvisor();
authorizationAttributeSourceAdvisor.setSecurityManager(securityManager());
return authorizationAttributeSourceAdvisor;
}
/**
* 配置加密匹配,使用MD5的方式,进行1024次加密
*/
// @Bean
// public HashedCredentialsMatcher hashedCredentialsMatcher() {
// HashedCredentialsMatcher hashedCredentialsMatcher = new HashedCredentialsMatcher();
// hashedCredentialsMatcher.setHashAlgorithmName("des");
// hashedCredentialsMatcher.setHashIterations(1024);
// return hashedCredentialsMatcher;
// }
}

3.重写realm

public class ShiroRealm extends AuthorizingRealm {
@Autowired
private LoginDao loginDao; // 验证权限(登录的时候使用的)
@Override
protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken) throws AuthenticationException {
UsernamePasswordToken token = (UsernamePasswordToken) authenticationToken;
String username = token.getUsername();
UserDO userDO = loginDao.selectOne(new QueryWrapper<UserDO>().eq("username", username));
if (userDO == null) {
throw new UnknownAccountException("未知账号");//没找到帐号
}
// 交给AuthenticatingRealm使用CredentialsMatcher进行密码匹配
//使用 ByteSource.Util.bytes() 来计算盐值.
return new SimpleAuthenticationInfo(userDO, userDO.getPassword(),ByteSource.Util.bytes(userDO.getPassword()), getName());
} // 添加权限
@Override
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {
return null;
} /**
* 设定Password校验
*/
@PostConstruct
public void initCredentialsMatcher() {
//重写shiro的密码验证,让shiro用我自己的验证
setCredentialsMatcher(new CustomCredentialsMatcher());
}
}

4. 重写密码验证类

public class CustomCredentialsMatcher extends SimpleCredentialsMatcher {

    /**
* 此方法为HashedCredentialsMatcher类中真正验证密码是否一致的地方
*/
@Override
public boolean doCredentialsMatch(AuthenticationToken authcToken, AuthenticationInfo info) {
// 明明authcToken跟info两个对象的里的Credentials类型都是Object,断点看到的类型都是 char[]
// 但是 token里转成String要先强转成 char[]
// 而info里取Credentials就可以直接使用 String.valueOf() 转成String
UsernamePasswordToken token = (UsernamePasswordToken) authcToken;
Object tokenCredentials = encrypt(String.valueOf(token.getPassword()));
Object infocredentials = getCredentials(info);
return equals(tokenCredentials, infocredentials);
} /**
* 明文密码加密,将传进来密码加密方法
*/
public String encrypt(String password) {
//这里可以选择自己的密码验证方式 比如 md5或者sha256等
String passwordEncrypt = password
return passwordEncrypt;
}
}

5. 登录的Controller

public userDO login(@RequestBody LoginRequest loginRequest) {
try {
Subject subject = SecurityUtils.getSubject();
UsernamePasswordToken token = new UsernamePasswordToken(loginRequest.getUsername(), loginRequest.getPassword());
subject.login(token);
System.out.println("登录成功");
} catch (UnknownAccountException e) {
return HttpResultUtil.error("账号不存在");
} catch (IncorrectCredentialsException e) {
return HttpResultUtil.error("密码错误");
}
catch (AuthenticationException e) {
return HttpResultUtil.error("账户被禁用,无法登录,请联系管理员");
}
UserDO userDO = (UserDO) SecurityUtils.getSubject().getPrincipal();
return userDO
}

springboot和shiro的整合的更多相关文章

  1. SpringBoot与Shiro的整合(单体式项目)

    1.包结构 2.jar包,配置文件,类 2.1pom.xml文件配置 <?xml version="1.0" encoding="UTF-8"?> ...

  2. SpringBoot与Shiro整合权限管理实战

    SpringBoot与Shiro整合权限管理实战 作者 : Stanley 罗昊 [转载请注明出处和署名,谢谢!] *观看本文章需要有一定SpringBoot整合经验* Shiro框架简介 Apach ...

  3. springboot 与 shiro 整合 (简洁版)

    前言: 网上有很多springboot 与 shiro 整合的资料,有些确实写得很好, 对学习shiro和springboot 都有很大的帮助. 有些朋友比较省事, 直接转发或者复制粘贴.但是没有经过 ...

  4. springboot shiro 基本整合

    springboot shiro 基本整合 https://www.w3cschool.cn/shiro/c52r1iff.html http://shiro.apache.org/configura ...

  5. SpringBoot+Shiro+mybatis整合实战

    SpringBoot+Shiro+mybatis整合 1. 使用Springboot版本2.0.4 与shiro的版本 引入springboot和shiro依赖 <?xml version=&q ...

  6. (八) SpringBoot起飞之路-整合Shiro详细教程(MyBatis、Thymeleaf)

    兴趣的朋友可以去了解一下前几篇,你的赞就是对我最大的支持,感谢大家! (一) SpringBoot起飞之路-HelloWorld (二) SpringBoot起飞之路-入门原理分析 (三) Sprin ...

  7. [03] SpringBoot+MyBatis+Shiro搭建杂谈

    0.写在前面的话 一直想能仿公司框架的形式,着手做一个简单的脚手架,一来是带着目标性能更好地学习,接触新的技术,另外自己如果有什么想要实现的简单需求,就可以进行快速开发,主要还是希望能在权限上有所控制 ...

  8. springboot集成shiro实现权限认证

    github:https://github.com/peterowang/shiro 基于上一篇:springboot集成shiro实现身份认证 1.加入UserController package ...

  9. (七) SpringBoot起飞之路-整合SpringSecurity(Mybatis、JDBC、内存)

    兴趣的朋友可以去了解一下前五篇,你的赞就是对我最大的支持,感谢大家! (一) SpringBoot起飞之路-HelloWorld (二) SpringBoot起飞之路-入门原理分析 (三) Sprin ...

随机推荐

  1. mapper.xml实现oracle的分页语句

    当我们用常规方法进行分页查询时,虽然在数据库可以分页查询出来数据, 如下语句 <!-- 分页查询所有 --> <select id="findAllPage" r ...

  2. Ubuntu18.04可执行文件运行提示No such file or directory

    参考原文见 https://blog.csdn.net/sun927/article/details/46593129? 最近我也遇到一个类似问题,同一个工具在Ubuntu16.04里面运行是好的,但 ...

  3. redis主从遇到的问题

    rendis安装 主从切换 Redis的HA方案 Redis高可用架构(1)—Keepalive+VIP 还是配置的问题   从一直无法连接上主 redis.conf配置 # Examples:# 1 ...

  4. Oracle 序列(查询序列的值,修改序列的值)

    1.序列的语法形式 create sequence 序列名 increment by n start with n maxvalue n | nomaxvalue minvalue n | nomin ...

  5. 021-PHP常用的数值类型判断函数

    <?php //判断数组 $colors = array("red", "blue", "green"); if(is_array($ ...

  6. junit基础学习之-引用spring容器的测试(7)

    context 自动注入的文章链接:http://www.360doc.com/content/11/0815/09/2371584_140471325.shtml

  7. python outline

    1.列表/数组/numpy/Pandas Python list 初始化技巧   (2018-12-27 11:54) python3 sort list   (2019-05-23 14:52) P ...

  8. 中国移动携手华为百度展示5G应用,实现8K视频传输

    在今日举行的 2019 年百度云智峰会上,中国移动携手华为和百度,首次展示基于 SA 架构的 5G Vertical LAN (行业局域网)技术,承载 8K 实时会议系统,助力企业云办公.该技术可为合 ...

  9. Java工程师面试题

    1. J2EE 是什么?它包括哪些技术?解答:从整体上讲,J2EE 是使用 Java 技术开发企业级应用的工业标准,它是 Java 技术不断适应和促进企业级应用过程中的产物.适用于企业级应用的 J2E ...

  10. CSS - input 美化

    input{ padding: 20px; width: 100%; height: 5vh; margin-bottom: 2vh; border-radius: 10vw; border: 0; ...