学习shiro框架

前言:shiro是权限控制常用框架,安全,易上手,是项目中常用权限控制框架,最近学习了一下,做了如下总结

Shrio单词

Incorrect 错误的
Credentials 证书,凭证
Principal 主要的,当事人
security 安全
Authenticator 认证者
Authentication 证明
Strategy 战略、策略
permission 允许、许可
role 角色、任务
subject 主题、科目
realm 领域、范围
permitted 被允许的
anonymous 匿名的

权限的组成部分

subject 登录的用户
role 角色(权限的集合 管理员(添加、删除、修改))
permission 权限(添加、修改、删除、查询、打印、发送…)
resource 资源(URL、按钮…)

粒度

Shiro在web环境下使用

  1. 添加Maven依赖
  2. 添加过滤器
<filter>
    <filter-name>shiroFilter</filter-name>
    <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
    <init-param>
        <param-name>targetFilterLifecycle</param-name>
        <param-value>true</param-value>
    </init-param>
</filter>
<filter-mapping>
    <filter-name>shiroFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>
  1. 创建spring的配置文件,并添加一个bean,bean的id需要filter的name值相同
<bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean">

</bean>
  1. 创建自己的Realm,用来指定认证和权限列表
  2. 接受账号和密码,进行登录

被认证 被记住
UI URL

Shiro第一个例子

写配置文件shiro.ini

[users]
tom=123123
jack=000000

测试代码为:

@Test
    public void hello() {
        //1. 读取classpath中的shiro.ini配置文件,并创建securityManagerFactory对象
        Factory<SecurityManager> securityManagerFactory = new IniSecurityManagerFactory("classpath:shiro.ini");
        //2. 获取SecurityManager
        SecurityManager securityManager = securityManagerFactory.getInstance();
        //3.设置SecurityManager(仅设置一次)
        SecurityUtils.setSecurityManager(securityManager);
        //4.获取当前登录的对象
        Subject subject = SecurityUtils.getSubject();
        //5.根据账号和密码进行登录
        UsernamePasswordToken usernamePasswordToken = new UsernamePasswordToken("tom","123123");
        //6.登录
        try {
            subject.login(usernamePasswordToken);
        } catch (UnknownAccountException ex) {
            ex.printStackTrace();
            System.out.println("无此账号");
        } catch (LockedAccountException ex) {
            ex.printStackTrace();
            System.out.println("账号被锁定");
        } catch (IncorrectCredentialsException ex) {
            ex.printStackTrace();
            System.out.println("密码错误");
        } catch (AuthenticationException ex) {
            ex.printStackTrace();
            System.out.println("账号或密码错误");
        }
        //7.安全退出
        subject.logout();
    }

Shiro在web环境下使用

  1. 添加Maven依赖
        <dependency>
            <groupId>org.apache.shiro</groupId>
            <artifactId>shiro-all</artifactId>
            <version>1.2.4</version>
        </dependency>
        <dependency>
            <groupId>commons-logging</groupId>
            <artifactId>commons-logging</artifactId>
            <version>1.2</version>
        </dependency>

2.在web.xml中添加过滤器

<filter>
    <filter-name>shiroFilter</filter-name>
    <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
    <init-param>
        <param-name>targetFilterLifecycle</param-name>
        <param-value>true</param-value>
    </init-param>
</filter>
<filter-mapping>
    <filter-name>shiroFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

3.创建spring配置文件

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

    <bean id="myRealm" class="com.kaishengit.shiro.MyRealm">
        <property name="userService" ref="userService"/>
    </bean>
    <!--securityManager-->
    <bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager">
        <property name="realm" ref="myRealm"/>
        <property name="cacheManager" ref="cacheManager"/>
    </bean>
    <!--cacheManager-->
    <bean id="cacheManager" class="org.apache.shiro.cache.MemoryConstrainedCacheManager"/>

    <!--lifeCicle-->
    <bean id="lifecycleBeanPostProcessor" class="org.apache.shiro.spring.LifecycleBeanPostProcessor"/>

    <!--form认证过滤器-->
    <bean id="formAuthenticationFilter" class="org.apache.shiro.web.filter.authc.FormAuthenticationFilter">
        <!--表单中账号的name属性值-->
        <property name="usernameParam" value="tel"/>
        <!--表单中密码-->
        <property name="passwordParam" value="password"/>
        <property name="loginUrl" value="/tourism/"/>
        <property name="successUrl" value="/tourism/home"/>
    </bean>

    <bean id="shiro" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean">
        <!--登录地址-->
        <property name="loginUrl" value="/tourism/"/>
        <!--登录成功地址-->
        <property name="successUrl" value="/tourism/home"/>
        <!--无权限地址-->
        <property name="unauthorizedUrl" value="/static/html/403.html"/>

        <property name="securityManager" ref="securityManager"/>

        <!--添加表单验证器-->
        <property name="filters">
            <map>
                <entry key="authc" value-ref="formAuthenticationFilter"/>
            </map>
        </property>

        <!--定义过滤规则-->
        <property name="filterChainDefinitions">
            <value>
                /static/** = anon
                /** = authc
            </value>
        </property>
    </bean>

</beans>
  1. 创建自己的Realm,用来指定认证和权限列表

import com.kaishengit.pojo.User;
import com.kaishengit.service.UserService;
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 MyRealm extends AuthorizingRealm {

    private UserService userService;

    public void setUserService(UserService userService) {
        this.userService = userService;
    }

    /**
     * 权限认证
     * @param principalCollection
     * @return
     */
    @Override
    protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {
        return null;
    }

    /**
     * 登录认证
     * @param authenticationToken
     * @return
     * @throws AuthenticationException
     */
    @Override
    protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken) throws AuthenticationException {
        UsernamePasswordToken token = (UsernamePasswordToken) authenticationToken;
        String tel = token.getUsername();
        User user = userService.findByTel(tel);
        if(user == null) {
            throw new UnknownAccountException("该账户不存在");
        } else if(User.STATE_DISABLE.equals(user.getState())) {
            throw new LockedAccountException("该帐号已被禁用");
        }

        return new SimpleAuthenticationInfo(user,user.getPassword(),getName());
    }
}
  1. 控制器中接受账号和密码,进行登录
@PostMapping("/")
    public String login(String tel,String password,RedirectAttributes redirectAttributes) {
        Subject subject = SecurityUtils.getSubject();
        UsernamePasswordToken token = new UsernamePasswordToken(tel,password);
        String errorMessage = "";
        try {
            subject.login(token);
        }catch (UnknownAccountException e) {
            errorMessage = "账号或密码错误";
        }catch (LockedAccountException e) {
            errorMessage = "账号被锁定";
        }catch (AuthenticationException e) {
            errorMessage = "认证异常";
        }
        if(!"".equals(errorMessage)){
            redirectAttributes.addFlashAttribute("message",errorMessage);
            return "redirect:/tourism/";
        }
        return "redirect:/tourism/home";
    }

权限控制

权限控制分为UI和URL级别

UI级别

使用标签库

<shiro:hasRole name="综合办公">
    <h3>综合办公</h3>
</shiro:hasRole>

URL级别

<!--定义过滤规则-->
<property name="filterChainDefinitions">
    <value>
        /static/** = anon
        /tourism/user/** = roles[系统管理]
        /tourism/ticket/** = roles[基本信息]
        /tourism/place/** = roles[基本信息]
        /** = user
    </value>
</property>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
学习Shiro框架可以按照以下步骤进行: 1. 了解基础概念:首先,你需要了解Shiro的基本概念和术语,例如主体(Subject)、认证(Authentication)、授权(Authorization)、Realm等。可以阅读Shiro的官方文档或者相关的教程来获得这些知识。 2. 安装和配置:安装Shiro框架并进行基本的配置。你可以在Shiro的官方网站上找到安装指南和配置示例。 3. 认证功能:学习如何使用Shiro进行用户认证,包括用户名密码认证、Remember Me功能、多Realm认证等。可以尝试编写简单的认证示例来理解这些功能。 4. 授权功能:学习如何使用Shiro进行用户授权,包括角色授权和权限授权。了解如何定义角色和权限,并且如何在代码中进行授权判断。 5. Session管理:了解Shiro如何管理用户的会话信息,包括会话超时、会话验证等。学习如何使用Shiro提供的Session API来管理会话。 6. 整合框架:如果你使用其他的Java框架,例如Spring或者Spring Boot,学习如何将Shiro与这些框架进行整合,以便更好地利用Shiro的功能。 7. 安全性优化:深入了解Shiro的安全性能优化技巧,例如密码加密、安全配置、防止常见安全漏洞等。 8. 实战练习:通过编写实际的应用程序来巩固所学的知识。可以尝试开发一个简单的Web应用程序,使用Shiro进行用户认证和授权。 除了官方文档和教程,还可以参考一些优秀的书籍或在线教程,例如《Apache Shiro官方指南》、《深入浅出Shiro安全框架》等。此外,加入Shiro的社区或者论坛,与其他开发者交流经验也是一个很好的学习方式。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值