(一)登陆的处理java
1. 导入权限控制shiro相关的jar包web
<!-- Apache Shiro 权限架构 --> <dependency> <groupId>org.apache.shiro</groupId> <artifactId>shiro-all</artifactId> <version>1.2.3</version> </dependency>
2. 在spring的配置文件applicationContent-shiro中添加5个bean的配置信息spring
<!--1. 安全管理器 --> <bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager"> <!--注入原材料属性 --> <property name="realm" ref="authRealm"></property> </bean> <!--2. 注入Realm原材料--> <bean id="authRealm" class="cn.tedu.shiro.AuthRealm"> <!--注入自定义的加密匹配器 --> <property name="credentialsMatcher" ref="authcredentialMacher"></property> </bean> <!--3.加密匹配器 --> <bean id="authcredentialMacher" class="cn.tedu.shiro.AuthcredentialMacher"> </bean> <!--4.权限认证通知 --> <bean id="advisor" class="org.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor"> <!-- 注入安全管理器 --> <property name="securityManager" ref="securityManagee"></property> </bean> <!--5.shiro过滤工厂 --> <bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean" > <!-- 注入安全管理器 --> <property name="secrityManager" ref="securityManager"></property> <!-- 注入登陆地址 --> <property name="loginUrl" value="/tologin"></property> <!-- 注入拦截地址和放行地址 --> <property name="filterChainDefinitions"> <value> <!-- 放行登陆按钮的请求地址 --> /login.action=anno <!-- 放行全部静态资源文件 --> /staticfile/**=anno <!-- 拦截剩下的全部 --> /**authc </value> </property> </bean>
3. 在web.xml文件中 配置shiro过滤器数据库
<!-- 配置shiro的过滤器 --> <filter> <!-- 此处name必定要和spring配置文件中的过滤工厂id一致 --> <filter-name>shiroFilter</filter-name> <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class> <!-- 配置让shiro的过滤工厂的生命周期 交由web容器进行管理 --> <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>
4. 在登陆controller中建立subject对象apache
//1.建立Subject Subject subject = SecurityUtils.getSubject(); //2.建立用户名密码的令牌 UsernamePasswordToken token = new UsernamePasswordToken(userName, password); //3.登陆 try { //若是成功 则无异常 登陆失败会抛出异常 subject.login(token); //获得详细用户对象存到session中 User user = (User) subject.getPrincipal(); user = userService.findOne(user.getUserId()); session.setAttribute("_CURRENT_USER", user); return "redirect:/home.action"; } catch (AuthenticationException exception) {//登陆失败 model.addAttribute("errorInfo", "用户名或密码错误!"); model.addAttribute("username", userName); model.addAttribute("password",password); return "sysadmin/login/login"; }
5. 提早准备好,下面3个类:安全
public class AuthRealm extends SimpleAccountRealm{ @Autowired private UserService userService; //给登陆提供素材 @Override protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) { UsernamePasswordToken upToken=(UsernamePasswordToken) token; //principal:正确的用户对象 User user =userService.findUserByUsername(upToken.getUsername()); //credentials:正确的用户密码 //realmName:原材料类的名称 AuthenticationInfo info=new SimpleAuthenticationInfo( user,user.getPassword(),this.getName()); return info; } Service层: @Override public User findUserByUsername(String username) { return userMapper.findUserByUsername(username); } Dao层: @Select("select * from user_p where username=#username") public User findUserByUsername(String username);
public class Md5Utils{ public static String getMd5(String password){ Md5Hash md5Hash = new Md5Hash(password, "tedu", 3); return md5Hash.toString(); } }
//加密匹配器,须要调用Md5Utils对输入的密码进行加密后和数据库中比较验证 public class AuthcredentialMacher extends SimpleCredentialsMatcher{ public boolean doGredentialsMatch(AuthenticationToken token,AuthenticationInfo info){ UsernamePasswordToken uptoken =(UsernamePasswordToken) token; //对用户输入的密码进行加密 String newPassword = Md5Utils.getMd5(String.valueOf(uptoken.getPassword())); //把加密后的密码设置回token中 uptoken.setPassword(newPassword.toCharArray()); return super.doCredentialsMatch(token, info); }
(二)实现shiro进行权限控制session
//给权限控制提供素材 @Override protected AuthorizationInfo doGetAuthorizationInfo( PrincipalCollection principals) { SimpleAuthorizationInfo info =new SimpleAuthorizationInfo(); User user =(User) principals.getPrimaryPrincipal(); List<String> list =userService.findModuleName(user.getUserId()); info.addStringPermissions(list); return info; }
2. 在jsp页面中经过shiro标签对页面进行判断处理 例如: 对这几个模块进行权限控制判断架构
1) 添加shiro的@taglib头文件 < %@ taglib uri="http://shiro.apache.org/tags" prefix="shiro"%> 2)对须要进行权限判的模块使用shiro标签进行处理 <div id="menuContent"> <shiro:authenticated name="系统管理"> <span id="topmenu" onclick="toModule('home');">系统首页</span><span id="tm_separator"></span> </shiro:authenticated> <shiro:authenticated name="货运管理"> <span id="topmenu" onclick="toModule('cargo');">货运管理</span><span id="tm_separator"></span> </shiro:authenticated> <shiro:authenticated name="基础信息"> <span id="topmenu" onclick="toModule('baseinfo');">基础信息</span><span id="tm_separator"></span> </shiro:authenticated> <shiro:authenticated name="系统管理"> <span id="topmenu" onclick="toModule('sysadmin');">系统管理</span> </shiro:authenticated> </div>