shiro与spring的整合使用

shiro与spring的整合使用

简介


Apache Shiro是Java的一个安全框架,Shiro可以帮助我们完成:认证、授权、加密、会话管理、与Web集成、缓存等。其基本功能点如下图所示:

这里写图片描述
Authentication:身份认证/登录,验证用户是不是拥有相应的身份;
Authorization:授权,即权限验证,验证某个已认证的用户是否拥有某个权限;即判断用户是否能做事情,常见的如:验证某个用户是否拥有某个角色。或者细粒度的验证某个用户对某个资源是否具有某个权限;
Session Manager:会话管理,即用户登录后就是一次会话,在没有退出之前,它的所有信息都在会话中;会话可以是普通JavaSE环境的,也可以是如Web环境的;
Cryptography:加密,保护数据的安全性,如密码加密存储到数据库,而不是明文存储;
Web Support:Web支持,可以非常容易的集成到Web环境;
Caching:缓存,比如用户登录后,其用户信息、拥有的角色/权限不必每次去查,这样可以提高效率;
Concurrency:shiro支持多线程应用的并发验证,即如在一个线程中开启另一个线程,能把权限自动传播过去;
Testing:提供测试支持;
Run As:允许一个用户假装为另一个用户(如果他们允许)的身份进行访问;
Remember Me:记住我,这个是非常常见的功能,即一次登录后,下次再来的话不用登录了。

(一)配置文件:

  1. 导入pom坐标
    <dependency>
        <groupId>org.apache.shiro</groupId>
        <artifactId>shiro-all</artifactId>
        <version>${shiro.version}</version>
    </dependency>

2.在web.xml文件中配置Filter拦截器

<filter>
    <filter-name>shiroFilter</filter-name>
    <filter-class>org.springframework.web.filter.DelegatingFilterProxy
    </filter-class>
</filter>
<filter-mapping>
    <filter-name>shiroFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

3.在applicationContext.xml文件中引入一个applicationContext-shiro.xml文件

<import resource="applicationContext-shiro.xml"/>

新建一个applicationContext-shiro.xml文件,内容如下:

    <!-- shiro filter配置 -->
    <bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean">
        <!-- shiro 的核心安全接口 -->
        <property name="securityManager" ref="securityManager" />
        <!-- 要求登录时的链接 -->
        <property name="loginUrl" value="/login.html" />
        <!-- 登陆成功后要跳转的连接 -->
        <property name="successUrl" value="/index.html" />
        <!-- 未授权时要跳转的连接 -->
        <property name="unauthorizedUrl" value="/unauthorized.html" />
        <!-- shiro 连接约束配置 -->
        <!-- url级别权限权限控制 -->
        <property name="filterChainDefinitions">
            <value>
                /login.html*=anon
                /user_login.action*=anon
                /validatecode.jsp*=anon
                /css/**=anon
                /js/**=anon
                /images/**=anon
                /services/**=anon
                /pages/base/courier.html*=perms[courier:list]
                /pages/base/area.html*=roles[base]
                /**=authc
            </value>
        </property>
    </bean>

    <!-- 安全管理器 -->
    <bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager">
        <property name="realm" ref="bosRealm"></property>

    </bean>
    <bean id="lifecycleBeanPostProcessor" class="org.apache.shiro.spring.LifecycleBeanPostProcessor" />
        <!-- 开启注解模式 -->
    <bean
        class="org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator"
        depends-on="lifecycleBeanPostProcessor">
        <property name="proxyTargetClass" value="true"></property>
    </bean>
    <bean
        class="org.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor">
        <property name="securityManager" ref="securityManager" />
    </bean>

(二)使用

了解 Shiro 执行流程, 应用程序 — Subject — SecurityManager — Realm 安全数据
自定义一个Realm类,继承AuthorizingRealm。

public class BosRealm extends AuthorizingRealm{

    @Autowired
    private UserService userService;

    @Autowired
    private RoleService roleService;

    @Autowired
    private PermissionService permissionService;
    @Override
    protected AuthorizationInfo doGetAuthorizationInfo(
            PrincipalCollection pc) {
        System.out.println("shiro授权管理..");
        SimpleAuthorizationInfo authorizationInfo=new SimpleAuthorizationInfo();
        Subject subject = SecurityUtils.getSubject();
        User user=(User) subject.getPrincipal();

        List<Role> roles=roleService.findroleByUser(user);
        for (Role role : roles) {
            authorizationInfo.addRole(role.getKeyword());

        }

        List<Permission> permissions=permissionService.findpermByUser(user);
        for (Permission permission : permissions) {
            authorizationInfo.addStringPermission(permission.getKeyword());
        }

        return authorizationInfo;
    }

    @Override
    protected AuthenticationInfo doGetAuthenticationInfo(
            AuthenticationToken token) throws AuthenticationException {
        System.out.println("shiro认证管理..");
        UsernamePasswordToken usernamePasswordToken=(UsernamePasswordToken) token;

        User user=userService.findByUsername(usernamePasswordToken.getUsername());
        if(user==null){
            return null;
        }else {
            return new SimpleAuthenticationInfo(user, user.getPassword(), getName());
        }


    }

}

1.用户授权
比如在一个登陆的action中

@Action(value="user_login",results={@Result(name="success",type="redirect",location="index.html"),@Result(name="login",type="redirect",location="login.html")})
    public String login(){
        Subject subject = SecurityUtils.getSubject();
        AuthenticationToken token=new UsernamePasswordToken(model.getUsername(), model.getPassword());

        try {
            subject.login(token);
            return SUCCESS;

        } catch (AuthenticationException e) {
            e.printStackTrace();
            return LOGIN;
        }

    }

用户退出:

@Action(value="user_logout",results={@Result(name="success",location="login.html",type="redirect")})
    public String logout(){
        Subject subject = SecurityUtils.getSubject();
        subject.logout();

        return SUCCESS;

    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值