设为首页 收藏本站
查看: 918|回复: 0

[经验分享] Apache Shiro(安全框架)

[复制链接]
累计签到:1 天
连续签到:1 天
发表于 2015-11-14 09:16:57 | 显示全部楼层 |阅读模式
  当前常用流行的安全框架主要有两种:一个是Apache Shiro;另一个是Springsource。
  现在介绍一下apache shiro
  既然是安全框架,解决的肯定是权限的控制。所谓权限是指:用户和系统之间的关系,即,某一组或一类用户在系统中所具有的不同的功能。在这为了更能诠释其关系,我们引用了角色,一个用户至少有一个角色,不同的角色在系统之中具有不同的功能,用户不能直接和系统建立关系,只能通过角色来体现。如在数据库中有四个表来体现:用户表,角色表,权限表,及用户的group表。用户和角色是多对多关系,角色和权限是一对多关系。
  在项目中使用步骤如下:
  一、在web.xml中配置
  
  <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>
  二、建立Dbrealm
  @Component
public class ShiroDbRealm extends AuthorizingRealm{

@Resource
private UserService userService;
//登录认证
  @Override
protected AuthenticationInfo doGetAuthenticationInfo( AuthenticationToken authenticationToken) throws AuthenticationException {

UsernamePasswordToken token = (UsernamePasswordToken) authenticationToken;
User user = userService.findByLoginName(token.getUsername());
if(user != null) {
  return new SimpleAuthenticationInfo(user.getLoginname(),
      user.getPassword(),getName());
}

return null;
}
  //权限认证
  @Override
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection  
  principalCollection) {
String loginName =  
  (String) principalCollection.fromRealm(getName()).iterator().next();
User user = userService.findByLoginName(loginName);
if(user != null) {
SimpleAuthorizationInfo info = new SimpleAuthorizationInfo();
//添加Group
info.setRoles(user.getGroupNameSet());
for(Group g : user.getGroupList()) {
//添加permission
info.addStringPermissions(g.getPermissionStringList());
}
return info;
}
return null;
}

  

  }

  三、在applicationContext-shiro.xml配置
  <bean id=&quot;securityManager&quot;  
  class=&quot;org.apache.shiro.web.mgt.DefaultWebSecurityManager&quot;>
<property name=&quot;realm&quot; ref=&quot;shiroDbRealm&quot; />
<property name=&quot;cacheManager&quot; ref=&quot;cacheManager&quot; />
</bean>

<!-- 項目自定义Realm -->
<bean id=&quot;shiroDbRealm&quot; class=&quot;com.kaishengit.services.account.ShiroDbRealm&quot; />

<!-- Shiro Filter -->
<bean id=&quot;shiroFilter&quot; class=&quot;org.apache.shiro.spring.web.ShiroFilterFactoryBean&quot;
<property name=&quot;securityManager&quot; ref=&quot;securityManager&quot; />
<property name=&quot;loginUrl&quot; value=&quot;/user!input.jspx&quot; />
<property name=&quot;successUrl&quot; value=&quot;/main.jspx&quot; />
<property name=&quot;unauthorizedUrl&quot; value=&quot;/403.jsp&quot; />
<property name=&quot;filterChainDefinitions&quot;>
    <value>
    /user!login.jspx = anon
    /user.jsp = roles[user]
    /** = authc
</value>
</property>

  </bean>

  <bean id=&quot;cacheManager&quot;  
class=&quot;org.apache.shiro.cache.MemoryConstrainedCacheManager&quot; />

<bean id=&quot;lifecycleBeanPostProcessor&quot;  
class=&quot;org.apache.shiro.spring.LifecycleBeanPostProcessor&quot; />

  

  四、登录和退出
  try {
   SecurityUtils.getSubject().login(
  new UsernamePasswordToken(user.getLoginname(), user.getPassword()));
} catch (AuthenticationException e) {
msg = &quot;用户名或密码错误!&quot;;
return INPUT;
}

//exit
SecurityUtils.getSubject().logout();

  

  五、标签
  <%@ taglib prefix=&quot;shiro&quot; uri=&quot;http://shiro.apache.org/tags&quot; %>

Hello, <shiro:principal/>, how are you today?

<shiro:hasRole name=&quot;administrator&quot;>  
  <a href=&quot;admin.jsp&quot;>Administer the system</a>  
</shiro:hasRole>
<shiro:hasAnyRoles name=“developer, manager,administrator&quot;>  
You are either a developer, manager, or administrator.   
</shiro:lacksRole>
<shiro:hasPermission name=&quot;user:create&quot;>  
<a href=&quot;createUser.jsp&quot;>Create a new User</a>   
</shiro:hasPermission>

  

         版权声明:本文为博主原创文章,未经博主允许不得转载。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-139014-1-1.html 上篇帖子: Apache Shiro Web Support学习笔记 下篇帖子: 在CentOS 6.3 64bit上为Apache Traffic Server 4.2.3挂载SSD并压测
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表