Spring Boot 整合 Shiro 简单实现用户登陆认证
Spring Boot 整合 Shiro 简单实现用户登陆认证
首先我用的是idea 使用idea自带的spring boot 插件创建的spring boot项目
我的目录结构中如下:
pom.xml :
<dependency> <groupId>org.apache.shiro</groupId> <artifactId>shiro-spring</artifactId> <version>1.4.0</version> </dependency> <dependency> <groupId>org.apache.shiro</groupId> <artifactId>shiro-core</artifactId> <version>1.4.0</version> </dependency> <dependency> <groupId>org.apache.shiro</groupId> <artifactId>shiro-ehcache</artifactId> <version>1.4.0</version> </dependency>
login.html:
Title 名字 密码我这边有个转接 页面text.html内容如下:
Title 用户添加 用户更改 登陆成功后可访问的页面1.add.html 2.update.html
ShiroConfig.java内容:
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 java.util.LinkedHashMap;
import java.util.Map;
@Configuration
public class ShiroConfig {
/**
* 创建ShiroFilerFactoryBean
*/
@Bean(name = "shiroFilterFactoryBean") public ShiroFilterFactoryBean getShiroFilterFactoryBean(@Qualifier("securityManager")DefaultWebSecurityManager securityManager){ ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean(); /** * 常用过滤器 * anon:无需登录(认证) 可以直接访问 * authc:必须登录才可以访问 * user:如果使用rememberMe的功能可以直接访问 * perms:该资源必须得到资源权限才可以访问 * role:该资源必须得到角色权限才可以访问 */ //使用Shiro内置的过滤器(权限相关的拦截) //修改默认登录页面 shiroFilterFactoryBean.setLoginUrl("/login"); Map<String,String> filterMap = new LinkedHashMap<>(); //为了保证数据的顺序LinkedHashMap
// 添加过滤器
filterMap.put("/stest",“anon”);
filterMap.put("/toLogin",“anon”);
filterMap.put("/*",“authc”);//所有user下的都需要过滤
shiroFilterFactoryBean.setFilterChainDefinitionMap(filterMap); //设置安全管理器 shiroFilterFactoryBean.setSecurityManager(securityManager); return shiroFilterFactoryBean; } /** * 创建DefaultWebSecurityManager */ @Bean(name = "securityManager") public DefaultWebSecurityManager getDefaultWebSecurityManager(@Qualifier("realmConfig") RealmConfig realmConfig){ DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager(); //关联realm securityManager.setRealm(realmConfig); return securityManager; } /** * 创建Realm */ @Bean(name = "realmConfig") public RealmConfig getRealm(){ return new RealmConfig(); }
}
RealmConfig.java内容:
import org.apache.shiro.authc.*;
import org.apache.shiro.authz.AuthorizationInfo;
import org.apache.shiro.realm.AuthorizingRealm;
import org.apache.shiro.subject.PrincipalCollection;
public class RealmConfig extends AuthorizingRealm {
/** * 执行授权逻辑 * @param principalCollection * @return */ @Override protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) { System.out.println("执行授权逻辑1"); return null; } /** * 执行授权逻辑 * @param * @return * @throws AuthenticationException */ @Override protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken arg0) throws AuthenticationException { System.out.println("执行授权逻辑"); //编写Shiro的认证逻辑 判断用户名密码 我这边没有连接数据库 而是简单的做啦下测试 String name = "admin"; String password = "852"; UsernamePasswordToken token = (UsernamePasswordToken)arg0; System.out.println(token.getUsername()); System.out.println(name); if (!token.getUsername().equals(name)){ //用户名不存在 return null; //shiro 底层会抛出UnknownAccountException } //判断密码 这里返回一个AuthenticationInfo的子类 password 是从数据库传过的面 shiro会自动去判断 return new SimpleAuthenticationInfo("",password,""); }
}
ShiroController 内容:
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; @Controller public class ShiroController { @RequestMapping("/login") public String login(){ return "login"; } @RequestMapping("/stest") public String Stest(){ return "test"; } @RequestMapping("https://blog.csdn.net/add") public String add(){ return "/userhttps://blog.csdn.net/add"; } @RequestMapping("https://blog.csdn.net/update") public String update(){ return "/userhttps://blog.csdn.net/update"; } @RequestMapping("/toLogin") public String toLogin(String name, String password, Model model){ System.out.println("进来啦"); /** * 使用 shiro编写认证操作 * * 1.获取Subject */ // 1.获取Subject Subject subject = SecurityUtils.getSubject(); // 2.封装用户数据 UsernamePasswordToken token = new UsernamePasswordToken(name,password); try { subject.login(token); //在这边认证其实是调用到RealmConfig 来做校验 return "redirect:/stest"; } catch (UnknownAccountException e) { //Shiro判断是否登录成功 抓取异常如果没有异常登录成功 // e.printStackTrace(); //Shiro 判断异常也是非常细腻 账号不存在 或者是密码错误 model.addAttribute("msg","账号不存在"); return "login"; } catch (IncorrectCredentialsException e) { //Shiro判断是否登录成功 抓取异常如果没有异常登录成功 // e.printStackTrace(); //Shiro 判断异常也是非常细腻 账号不存在 或者是密码错误 model.addAttribute("msg","密码错误"); return "login"; } } }
登陆页面
登陆成功后可访问的页面:
- spring boot 与shiro实战(三) 整合实现用户认证
- spring boot mybatis 整合shiro简单实现登陆权限管理
- 单体物联平台系统(Springboot整合shiro实现多realm多用户表多权限表登陆)
- Spring Boot 整合 Shiro实现认证及授权管理
- SpringBoot整合Shiro实现基于角色的权限访问控制(RBAC)系统简单设计从零搭建
- Spring Boot整合JWT实现用户认证
- SpringBoot整合Shiro实现登录认证的方法
- spring boot 与shiro实战(五)整合实现用户授权
- SpringBoot整合Shiro及简单实现
- SpringBoot2.0整合Shiro框架实现用户权限管理的示例
- Spring boot 整合shiro 实现登陆验证
- SpringBoot整合mybatis、shiro、redis实现基于数据库的细粒度动态权限管理系统实例
- Spring Boot实战之netty-socketio实现简单聊天室(给指定用户推送消息)
- springboot(十四):springboot整合shiro-登录认证和权限管理
- SpringBoot整合mybatis、shiro、redis实现基于数据库的细粒度动态权限管理系统实例
- spring-boot 整合 spring-security(用户管理,角色管理,权限管理,验证码,注册功能实现)
- Spring Boot 整合Shiro安全认证框架
- Spring Boot实战之Filter实现使用JWT进行接口认证 jwt(json web token) 用户发送按照约定,向服务端发送 Header、Payload 和 Signature,
- 基于SpringBoot简单实现SpringAop+Redis+cookie 单点登录 和 用户登录检测
- Spring、SpringMVC、Mybatis、Shiro简单整合,测试基于角色的登陆与访问路径的权限验证