`
iaiai
  • 浏览: 2195738 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Shiro权限框架

    博客分类:
  • J2EE
 
阅读更多
开发系统中,少不了权限,目前java里的权限框架有SpringSecurity和Shiro(以前叫做jsecurity),对于SpringSecurity:功能太过强大以至于功能比较分散,使用起来也比较复杂,跟Spring结合的比较好。对于初学Spring Security者来说,曲线还是较大,需要深入学习其源码和框架,配置起来也需要费比较大的力气,扩展性也不是特别强。

对于新秀Shiro来说,好评还是比较多的,使用起来比较简单,功能也足够强大,扩展性也较好。听说连Spring的官方都不用Spring Security,用的是Shiro,足见Shiro的优秀。网上找到两篇介绍:http://www.infoq.com/cn/articles/apache-shiro http://www.ibm.com/developerworks/cn/opensource/os-cn-shiro/,官网http://shiro.apache.org/ ,使用和配置起来还是比较简单。下面只是简单介绍下我们是如何配置和使用Shiro的(暂时只用到了Shiro的一部分,没有配置shiro.ini文件)。
首先是添加过滤器,在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>

权限的认证类:
public class ShiroDbRealm extends AuthorizingRealm {
    @Inject
    private UserService userService ;
    
    /**
 * 认证回调函数,登录时调用.
 */
protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authcToken) 
throws AuthenticationException {
UsernamePasswordToken token = (UsernamePasswordToken) authcToken;
User user= userService.getUserByUserId(token.getUsername());
if (user!= null) {	 
    return new SimpleAuthenticationInfo(user.getUserId(), user.getUserId(), getName());
} else {
return null;
}
}
/**
 * 授权查询回调函数, 进行鉴权但缓存中无用户的授权信息时调用.
 */
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {
String loginName = (String) principals.fromRealm(getName()).iterator().next();
User user= userService.getUserByUserId(loginName);
if (user != null) {
SimpleAuthorizationInfo info = new SimpleAuthorizationInfo();
info.addStringPermission("common-user");
return info;
} else {
return null;
}
}
}

Spring的配置文件:
<?xml version="1.0" encoding="UTF-8"?>
<beans >
<description>Shiro Configuration</description>
<bean class="org.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor"/>
<bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager">
<property name="realm" ref="shiroDbRealm" />
</bean>
<bean id="shiroDbRealm" class="com.company.service.common.shiro.ShiroDbRealm" />
    <bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean">
        <property name="securityManager" ref="securityManager"/>
        <property name="loginUrl" value="/common/security/login" />
        <property name="successUrl" value="/common/security/welcome" />
        <property name="unauthorizedUrl" value="/common/security/unauthorized"/>
        <property name="filterChainDefinitions">
            <value>
                /resources/** = anon
                /manageUsers = perms[user:manage]
                /** = authc
            </value>
        </property>
    </bean>
<bean id="lifecycleBeanPostProcessor" class="org.apache.shiro.spring.LifecycleBeanPostProcessor" />
    <bean class="org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator" depends-on="lifecycleBeanPostProcessor"/>
    <bean class="org.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor">
        <property name="securityManager" ref="securityManager"/>
    </bean>
</beans>

登录的Controller:
@Controller
@RequestMapping(value = "/common/security/*")
public class SecurityController {
    @Inject
    private UserService userService;
    @RequestMapping(value = "/login")
    public String login(String loginName, String password,
HttpServletResponse response, HttpServletRequest request) throws Exception {
        User user = userService.getUserByLogin(loginName);
            if (null != user) {
                setLogin(loginInfoVO.getUserId(), loginInfoVO.getUserId());
                return "redirect:/common/security/welcome";
            } else {
                return "redirect:/common/path?path=showLogin";
            }
    };
    public static final void setLogin(String userId, String password) {
        Subject currentUser = SecurityUtils.getSubject();
        if (!currentUser.isAuthenticated()) {
            //collect user principals and credentials in a gui specific manner 
            //such as username/password html form, X509 certificate, OpenID, etc.
            //We'll use the username/password example here since it is the most common.
            //(do you know what movie this is from? ;)
            UsernamePasswordToken token = new UsernamePasswordToken(userId, password);
            //this is all you have to do to support 'remember me' (no config - built in!):
            token.setRememberMe(true);
            currentUser.login(token);
        }
    };
    
    @RequestMapping(value="/logout")
    @ResponseBody
    public void logout(HttpServletRequest request){
        Subject subject = SecurityUtils.getSubject();
        if (subject != null) {           
            subject.logout();
        }
        request.getSession().invalidate();
    };
}
注册和获取当前登录用户:
    public static final void setCurrentUser(User user) {
        Subject currentUser = SecurityUtils.getSubject();
        if (null != currentUser) {
            Session session = currentUser.getSession();
            if (null != session) {
                session.setAttribute(Constants.CURRENT_USER, user);
            }
        }
    };
    public static final User getCurrentUser() {
        Subject currentUser = SecurityUtils.getSubject();
        if (null != currentUser) {
            Session session = currentUser.getSession();
            if (null != session) {
                User user = (User) session.getAttribute(Constants.CURRENT_USER);
                if(null != user){
                    return user;
                }
}
}
    };

需要的jar包有3个:shiro-core.jar,shiro-spring.jar,shiro-web.jar。感觉shiro用起来比SpringSecurity简单很多。

分享到:
评论

相关推荐

    ssm+shiro权限框架

    SSM+Shiro权限框架是Java Web开发中常用的一种安全控制解决方案,主要结合了Spring、Spring MVC、MyBatis和Apache Shiro四个组件。这个框架提供了全面的权限管理功能,包括用户认证、授权、会话管理和安全性日志等。...

    shiro权限框架示例

    在这个"shiro权限框架示例"中,我们可以深入学习Shiro的核心功能及其在实际项目中的应用。 1. **Shiro框架介绍** Apache Shiro 并非一个完整的安全框架,而是专注于应用程序的安全控制层,它不涉及网络协议或底层...

    Shiro权限框架文档

    标题中提到的“Shiro权限框架”是一个用于Java语言的开源权限管理库,旨在通过提供安全功能如身份验证、授权、会话管理以及加密等,简化Java应用程序中的安全操作。Shiro是一个易于使用且强大的权限框架,它既可以...

    Shiro权限框架由浅入深讲解教程课件

    Apache Shiro 是一个轻量级的 Java 安全框架,主要负责身份验证、授权、加密以及会话管理。它的设计目标是简化应用安全的实现,让开发者能够快速地为各种类型的程序添加安全特性,从简单的命令行应用到复杂的 web ...

    Shiro 权限框架使用总结

    Shiro 权限框架使用总结 Shiro 是一个强大而灵活的开源安全框架,能够非常清晰的处理认证、授权、管理会话以及密码加密。Shiro 的主要特点包括易于理解的 Java Security API、简单的身份认证、对角色的简单的签权、...

    Spring MVC+mybatis+easyui+ueditor+shiro权限框架管理系统

    《构建基于Spring MVC+MyBatis+EasyUI+UEditor+Shiro的权限管理框架系统》 在现代企业级Web应用开发中,高效、安全、易维护的框架选择至关重要。本项目采用Spring MVC、MyBatis、EasyUI、UEditor以及Shiro这五大...

    由浅入深掌握Shiro权限框架视频教程

    ​ 2、shiro权限框架的核心组件 ​ 3、springboot下shiro的使用 ​ 4、shiro认证鉴权的缓存机制 ​ 5、分布式下使用shrio处理统一会话 ​ 6、密码重试次数,并发登录控制 ​ 7、前后端分离的鉴权方式 ​ 8、...

    SpringBoot整合Shiro权限框架

    SpringBoot整合Shiro权限框架是将SpringBoot与Apache Shiro这两个流行的技术栈结合,用于实现Web应用的安全控制和用户权限管理。SpringBoot以其简洁的配置和快速的开发体验深受开发者喜爱,而Shiro则是一个轻量级的...

    Java SSM+Shiro权限框架

    Java SSM+Shiro权限框架是企业级Web应用开发中常用的一种组合,它结合了Spring、Spring MVC、MyBatis三大框架以及Apache Shiro安全框架,用于构建高效、灵活的权限控制体系。在这个体系中,Spring负责管理Bean,...

    shiro权限框架Demo

    在这个"shiro权限框架Demo"中,我们主要探讨如何使用Shiro来实现一个简单的权限管理模型。以下是对这个Demo的详细解读: 1. **身份验证**(Authentication):Shiro提供了用户登录验证的机制。在Demo中,可能包含了...

    shiro权限框架资料.zip

    shiro 权限框架学习资料, 从最基本的maven 工程到springboot 的整合, 再到一个通用的RBAC 权限框架模板的设计与创作, 包括视频, 源码, 资料, 稳定, 笔记, 软件, 依赖等等

    shiro权限框架

    ### Shiro权限框架详解 #### 一、权限概述与核心概念 在现代软件系统中,权限控制是一项重要的安全措施,它确保只有经过适当验证和授权的用户才能访问特定资源或执行特定操作。权限控制通常包括两个核心方面:认证...

    由浅入深掌握Shiro权限框架资料.zip

    2、shiro权限框架的核心组件;3、springboot下shiro的使用; 4、shiro认证鉴权的缓存机制;5、分布式下使用shrio处理统一会话;6、密码重试次数,并发登录控制;7、前后端分离的鉴权方式;8、建立分布式统一鉴权系统...

    shiro权限框架自定义Realm示例

    在这个“shiro权限框架自定义Realm示例”中,我们将深入理解Shiro的核心组件Realm以及如何根据实际需求对其进行定制。 Realm在Shiro中扮演着关键角色,它是Shiro与应用程序特定的安全数据源(如数据库、LDAP或文件...

    shiro权限框架例子

    使用spingmvc、shiro权限框架做的一个小例子,例子是基于简单的SpringMvc和shiro的配置完成,动态分配权限也写的相对简单,主要是在RememberMe中想在关闭网页后下次自动获取登录这点本人比较模糊,希望有大虾指点...

    JFinal2.0整合shiro权限框架,简单好用

    **JFinal2.0整合Apache Shiro权限框架详解** JFinal是一个基于Java的高效、轻量级的Web开发框架,它的设计目标是让开发者能够快速地进行开发,减少了大量重复的代码工作。Apache Shiro则是一款强大的安全管理框架,...

    shiro权限框架文档

    Shiro框架的设计理念是将安全的实现透明化,也就是说,它可以更容易地、更直观地被理解和使用。Shiro的目的是为了保护应用程序和系统,从简单的命令行应用程序到复杂的网络和企业应用程序都可以使用。 Shiro的安全...

    java shiro权限框架权限分配数据库mysql

    shiro权限框架,数据库mysql,框架用的是springmvc+mybatis+maven部署直接可用

Global site tag (gtag.js) - Google Analytics