引
shiro与springboot整合,项目中所有请求通过shiro处理,达到一个系统安全的目的。
开局一张图

请求进到系统会先到ShiroFilter,ShiroFilter会去找SercurityManager做认证和授权,认证通过后再进行判断是否为公共资源,非公共资源要授权操作才能访问系统资源。
跑起来
依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--shiro依赖-->
<dependency>
<groupId>org.apache.shiro</groupId>
<artifactId>shiro-spring-boot-starter</artifactId>
<version>1.7.0</version>
</dependency>
<!--jsp依赖-->
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-jasper</artifactId>
</dependency>
<dependency>
<groupId>jstl</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</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>
yml
server:
port: 8888
servlet:
context-path: /shiro
spring:
application:
name: shiro
mvc:
view:
prefix: /
suffix: .jsp
web目录
index.jsp相当于受限资源,login.jsp相当于公共资源
<%@page contentType="text/html; utf-8" pageEncoding="utf-8" isELIgnored="false" %>
<!doctype html>
<html lang="en">
<header>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width,user-scalable=no,
" >
<meta http-equiv="x-ua-compatible" content="ie=edge">
<title>首页</title>
</header>
<body>
hello world!这是系统主页
<h1>用户管理</h1>
<h1>商品管理</h1>
<h1>。。。</h1>
</body>
</html>
访问localhost:8888/shiro

ok,写个整合的配置类
/**
* 整合shiro框架相关的配置类
*/
@Configuration
public class ShiroConfig {
//创建shiroFilter 负责拦截所有请求
@Bean
public ShiroFilterFactoryBean getShiroFilterFactoryBean(DefaultWebSecurityManager defaultWebSecurityManager){
ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean();
//给filter设置安全管理器
shiroFilterFactoryBean.setSecurityManager(defaultWebSecurityManager);
return shiroFilterFactoryBean;
}
//创建安全管理器
@Bean
public DefaultWebSecurityManager getdeDefaultWebSecurityManager(Realm realm){
DefaultWebSecurityManager defaultWebSecurityManager = new DefaultWebSecurityManager();
//给安全管理器设置自定义realm
defaultWebSecurityManager.setRealm(realm);
return defaultWebSecurityManager;
}
//创建自定义Realm
@Bean
public Realm getrRealm(){
return new CustomerRealm();
}
}
自定义realm
public class CustomerRealm extends AuthorizingRealm {
@Override
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {
return null;
}
@Override
protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken) throws AuthenticationException {
return null;
}
}
再访问,ok,没有变化,得在配置类里配置哪些资源是公共资源和受限资源。
把index.jsp请求和/请求配成受限资源。
//创建shiroFilter 负责拦截所有请求
@Bean
public ShiroFilterFactoryBean getShiroFilterFactoryBean(DefaultWebSecurityManager defaultWebSecurityManager){
ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean();
//给filter设置安全管理器
shiroFilterFactoryBean.setSecurityManager(defaultWebSecurityManager);
Map<String,String> map = new HashMap<String,String>();
//配置系统公共资源
map.put("user/login","anon");
//配置系统受限资源
/*map.put("/index.jsp","authc"); //authc,请求这个资源需要认证和授权
map.put("/","authc");*/
map.put("/**","authc");
shiroFilterFactoryBean.setFilterChainDefinitionMap(map);
//设置认证界面路径
shiroFilterFactoryBean.setLoginUrl("/login.jsp");
return shiroFilterFactoryBean;
}
再访问直接去了公共资源login.jsp了。
过滤器
上边map里放了一个authc就表示了请求这个资源需要认证和授权,别的缩写呢?
| 配置缩写 | 对应的过滤器 | 功能 |
|---|---|---|
| anon | AnonymousFilter | 可匿名访问(也就是公共资源) |
| authc | FormAuthenticationFilter | 需要form表单登录 |
| authcBasic | BasicHttpAuthenticationFilter | 需要basic登录 |
| logout | LogoutFilter | 登出过滤器,实现退出功能 |
| noSessionCreation | NoSessionCreationFilter | 禁止创建会话 |
| perms | PermissionsAuthorizationFilter | 需要指定权限才能访问 |
| port | PortFilter | 需要指定端口才能访问 |
| rest | HttpMethodPermissionFilter | 把http请求方法转化成相应的动词来构建一个权限字符串 |
| roles | RolesAuthorizationFilter | 需要指定角色才能访问 |
| ssl | SslFilter | 需要https请求才能访问 |
| user | UserFilter | 需要已登录或者“记住我”的用户才能访问 |
登录退出实现
登录界面加个form先
<form action="${pageContext.request.contextPath}/user/login" method="post">
user:<input type="text" name="name" /><br>
pass:<input type="text" name="pass" /><br>
<input type="submit" value="login" />
</form>
主页加个退出按钮(略)
controller
@RestController
@RequestMapping("user")
public class UserController {
/**
* 处理身份信息
*/
@RequestMapping("login")
public String login(String name, String pass){
//获取主体对象
Subject subject = SecurityUtils.getSubject();
try {
subject.login(new UsernamePasswordToken(name,pass));
System.out.println("登录成功");
} catch (UnknownAccountException e){
System.out.println("用户名不存在");
}catch (IncorrectCredentialsException e){
System.out.println("密码错误");
}
return "redirect: /index.jsp";
}
/**
* 退出登录
*/
public String logout(){
Subject subject = SecurityUtils.getSubject();
subject.logout();
return "redirect:/login.jsp";
}
}
realm认证还是假装查数据库
@Override
protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken) throws AuthenticationException {
String principal = (String) authenticationToken.getPrincipal();
if("zhaoshanhe".equals(principal)){
return new SimpleAuthenticationInfo(principal,"123456",getName());
}
return null;
}
本文介绍了如何将Shiro与SpringBoot结合,通过ShiroFilter处理系统安全,包括登录、退出的实现。配置中定义了过滤器,限制了公共资源和受保护资源的访问,并提供了登录页面和简单的控制器实现。
1045

被折叠的 条评论
为什么被折叠?



