SpringBoot与Shrio(一)简单登录退出

本文介绍了如何将Shiro与SpringBoot结合,通过ShiroFilter处理系统安全,包括登录、退出的实现。配置中定义了过滤器,限制了公共资源和受保护资源的访问,并提供了登录页面和简单的控制器实现。

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目录
jspindex.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就表示了请求这个资源需要认证和授权,别的缩写呢?

配置缩写对应的过滤器功能
anonAnonymousFilter可匿名访问(也就是公共资源)
authcFormAuthenticationFilter需要form表单登录
authcBasicBasicHttpAuthenticationFilter需要basic登录
logoutLogoutFilter登出过滤器,实现退出功能
noSessionCreationNoSessionCreationFilter禁止创建会话
permsPermissionsAuthorizationFilter需要指定权限才能访问
portPortFilter需要指定端口才能访问
restHttpMethodPermissionFilter把http请求方法转化成相应的动词来构建一个权限字符串
rolesRolesAuthorizationFilter需要指定角色才能访问
sslSslFilter需要https请求才能访问
userUserFilter需要已登录或者“记住我”的用户才能访问

登录退出实现

登录界面加个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;
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值