标签:version 通过 nmap 管理 简单 使用 equals 这一 stat
<span style="font-size: 18px;"><?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-3.2.xsd" default-lazy-init="true"> <bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean"> <property name="securityManager" ref="securityManager" /> <property name="loginUrl" value="/shiro/turnlogin.do" /> <property name="successUrl" value="/shiro/success.do" /> <property name="unauthorizedUrl" value="/shiro/unauth.do" /> <property name="filterChainDefinitions"> <value> /shiro/success = authc <!-- authc 表示需要认证才能访问的页面 --> /shiro/success = authc, perms[/home] <!-- perms 表示需要该权限才能访问的页面 --> </value> </property> </bean> <bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager"> <property name="realm" ref="myShiroRealm"></property> </bean> <bean id="lifecycleBeanPostProcessor" class="org.apache.shiro.spring.LifecycleBeanPostProcessor" /> <bean id="myShiroRealm" class="com.hfmx.util.shiro.MyShiroRealm"> <!-- businessManager 用来实现用户名密码的查询 --> <span style="font-family: Arial, Helvetica, sans-serif;"><!-- </span><span style="font-family: Arial, Helvetica, sans-serif;"><property name="shiroService" ref="shiroService" /> </span><span style="font-family: Arial, Helvetica, sans-serif;">--></span><span style="font-family: Arial, Helvetica, sans-serif;"> </span></bean> <bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver"> <property name="exceptionMappings"> <props> <!--登录--> <prop key="org.apache.shiro.authz.UnauthenticatedException"> redirect:/shiro/turnlogin.do </prop> <!--授权--> <prop key="org.apache.shiro.authz.UnauthorizedException"> redirect:/shiro/turnlogin.do </prop> </props> </property> <property name="defaultErrorView" value="s/403" /> </bean> </beans></span>
在applicationContext中引入该文件
<import resource="classpath*:/spring-shiro.xml" />
在springMVC中加入:
<!-- 开启Shiro的注解,实现对Controller的方法级权限检查(如@RequiresRoles,@RequiresPermissions),需
借助SpringAOP扫描使用Shiro注解的类,并在必要时进行安全逻辑验证 -->
<!-- 需要在 sprimg-MVC的配置文件中 -->
<span style="font-size: 18px;">
<bean id="controllerAdvisorAutoProxyCreator" class="org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator"
depends-on="lifecycleBeanPostProcessor"/> <bean id="controllerAuthorizationAttributeSourceAdvisor"
class="org.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor"> <property name="securityManager" ref="securityManager"/> </bean>
</span>
@Override public AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken at) throws AuthenticationException { //1. 把AuthenticationToken 转化为 UsernamePasswordToken UsernamePasswordToken token = (UsernamePasswordToken) at; //2. 从UsernamePasswordToken 中获取 username String username = token.getUsername(); char[] password = token.getPassword(); //3. 调用数据库的方法,从数据库中查询 username 对应的用户记录 //4. 若用户不存在,则可以抛出 UnknownAccountException //5. 根据用户信息的情况,决定是否需要抛出其他的AuthenticationException 异常 //6. 根据用户的情况,来构建 AuthenticationInfo 对象并返回 //不带 盐值的 加密 -- 可能存在密码相同时 加密后的密文也是相同的 return new SimpleAuthenticationInfo(username, new String(password), getName()); //带盐值加密 -- 最安全 //ByteSource credentialsSalt = ByteSource.Util.bytes(user.getUsername()); //return new SimpleAuthenticationInfo(user.getUsername(), user.getPassword(), credentialsSalt, getName()); }
因为公司的系统 用户登陆后,拥有的资源保存在session中,于是有了这样一个想法,将这些资源再交给shiro框架,让它来限制住用户只能访问自己的资源,那么就使用@RequiresPermissions ("url地址") 注解方式,可以达到最完美的权限控制,这里也贴一下代码:
@Override public AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection pc) { //1. 从PrincipalCollection 中获取登录用户的信息 Object principal = pc.getPrimaryPrincipal(); //2. 利用登录用户的信息来获取当前用户的角色或权限(可能需要查询数据库) //3. 创建SimpleAuthorizationInfo,并设置roles属性 //4. 返回SimpleAuthorizationInfo对象 //通过从shiro session值中获取信息 List<String> urllist = (List<String>) SecurityUtils.getSubject().getSession().getAttribute("url"); if(null!=urllist&&urllist.size()!=0){ SimpleAuthorizationInfo info = new SimpleAuthorizationInfo(); for (String url : urllist) { if(null!=url&&(!(url.trim()).equals(""))){ info.addStringPermission(url); } } return info; } /*// 根据自己系统规则的需要编写获取授权信息,这里只获取了用户对应角色的资源url信息 String username = (String) pc.fromRealm(getName()).iterator().next(); //指定url访问 通过查找数据库的方式进行 if (username != null) { ArrayList<String> urls = shiroService.getUrlByName(username); if(null!=urls&&urls.size()!=0){ SimpleAuthorizationInfo info = new SimpleAuthorizationInfo(); for (String url : urls) { if(null!=url&&(!(url.trim()).equals(""))){ info.addStringPermission(url); } } return info; } }*/ return null; }
Subject currentUser = SecurityUtils.getSubject(); Session session = currentUser.getSession(); session.setAttribute("url", list);
//通过从shiro session值中获取信息 List<String> urllist = (List<String>) SecurityUtils.getSubject().getSession().getAttribute("url"); if(null!=urllist&&urllist.size()!=0){ SimpleAuthorizationInfo info = new SimpleAuthorizationInfo(); for (String url : urllist) { if(null!=url&&(!(url.trim()).equals(""))){ info.addStringPermission(url); } } return info; }
//1. 通过从shiro session 直接获取登录时存放的url资源 (非集群 下 使用) /* List<String> urllist = (List<String>) SecurityUtils.getSubject().getSession().getAttribute("url"); if(null!=urllist&&urllist.size()!=0){ SimpleAuthorizationInfo info = new SimpleAuthorizationInfo(); for (String url : urllist) { if(null!=url&&(!(url.trim()).equals(""))){ info.addStringPermission(url); } } return info; }*/ //2. 通过 request的session获取登录时存放的url资源 (集群 非集群 下 通用--效率高) HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest(); List<String> urllist = (List<String>)request.getSession().getAttribute("url"); if(null!=urllist&&urllist.size()!=0){ SimpleAuthorizationInfo info = new SimpleAuthorizationInfo(); for (String url : urllist) { if(null!=url&&(!(url.trim()).equals(""))){ info.addStringPermission(url); System.err.println("添加资源"+url); } } return info; } //3. 根据自己系统规则的需要编写获取授权信息,这里只获取了用户对应角色的资源url信息 (集群 非集群 下 通用--效率低下) /*String username = (String) pc.fromRealm(getName()).iterator().next(); //指定url访问 通过查找数据库的方式进行 if (username != null) { ArrayList<String> urls = shiroService.getUrlByName(username); if(null!=urls&&urls.size()!=0){ SimpleAuthorizationInfo info = new SimpleAuthorizationInfo(); for (String url : urls) { if(null!=url&&(!(url.trim()).equals(""))){ info.addStringPermission(url); } } return info; } }*/
到此 最完美的解决方法也就是 (第二种)资源还是 放在 HttpSession 中 最合理!
标签:version 通过 nmap 管理 简单 使用 equals 这一 stat
原文地址:http://www.cnblogs.com/sutao/p/7634230.html