说明:本文很多观点和内容来自互联网以及各种资料,如果侵犯了您的权益,请及时联系我,我会删除相关内容。
基本上涉及到用户参与的系统都要进行权限管理,权限管理属于系统安全的范畴,权限管理实现对用户访问系统的控制,按照安全规则或者安全策略控制用户可以访问而且只能访问自己被授权的资源。
权限管理包括用户身份认证和授权两部分,简称认证授权。对于需要访问控制的资源用户首先经过身份认证,认证通过后用户具有该资源的访问权限方可访问。
- if(主体.hasRole("总经理角色id")){
- 查询工资
- }
缺点:以角色进行访问控制粒度较粗,如果上图中查询工资所需要的角色变化为总经理和部门经理,此时就需要修改判断逻辑为 "判断主体的角色是否是总经理或部门经理",系统可扩展性差。
修改代码如下:
- if(主体.hasRole("总经理角色id") || 主体.hasRole("部门经理角色id")){
- 查询工资
- }
- if(主体.hasPermission("wage:query")){
- 查询工资
- }
优点:系统设计时定义好查询工资的权限标识,即使查询工资所需要的角色变化为总经理和部门经理也只需要将 "查询工资信息权限" 添加到 "部门经理角色" 的权限列表中,判断逻辑不用修改,系统可扩展性强。
shiro.ini-----> 通过 Shiro.ini 配置文件初始化 SecurityManager 环境。
- [users]
- zhang=123
- lisi=123
认证代码
- // 用户登陆、用户退出
- @Test public void testLoginLogout() {
- // 构建SecurityManager工厂,IniSecurityManagerFactory可以从ini文件中初始化SecurityManager环境
- Factory < SecurityManager > factory = new IniSecurityManagerFactory("classpath:shiro.ini");
- // 通过工厂创建SecurityManager
- SecurityManager securityManager = factory.getInstance();
- // 将securityManager设置到运行环境中
- SecurityUtils.setSecurityManager(securityManager);
- // 创建一个Subject实例,该实例认证要使用上边创建的securityManager进行
- Subject subject = SecurityUtils.getSubject();
- // 创建token令牌,记录用户认证的身份和凭证即账号和密码
- UsernamePasswordToken token = new UsernamePasswordToken("zhang", "123");
- try {
- // 用户登陆
- subject.login(token);
- } catch(AuthenticationException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- // 用户认证状态
- Boolean isAuthenticated = subject.isAuthenticated();
- System.out.println("用户认证状态:" + isAuthenticated);
- // 用户退出
- subject.logout();
- isAuthenticated = subject.isAuthenticated();
- System.out.println("用户认证状态:" + isAuthenticated);
- }
认证执行流程
1、 创建 token 令牌,token 中有用户提交的认证信息即账号和密码
2、 执行 subject.login(token),最终由 securityManager 通过 Authenticator 进行认证
3、 Authenticator 的实现 ModularRealmAuthenticator 调用 realm 从 ini 配置文件取用户真实的账号和密码,这里使用的是 IniRealm(shiro 自带)
4、 IniRealm 先根据 token 中的账号去 ini 中找该账号,如果找不到则给 ModularRealmAuthenticator 返回 null,如果找到则匹配密码,匹配密码成功则认证通过。
上边的程序使用的是 Shiro 自带的 IniRealm,IniRealm 从 ini 配置文件中读取用户的信息,大部分情况下需要从系统的数据库中读取用户信息,所以需要自定义 realm。
shiro 提供的 realm
realm 父子结构. png
最基础的是 Realm 接口,CachingRealm 负责缓存处理,AuthenticationRealm 负责认证,AuthorizingRealm 负责授权,通常自定义的 realm 继承 AuthorizingRealm。
- public class CustomRealm1 extends AuthorizingRealm {
- @Override
- public String getName() {
- return "customRealm1";
- }
- //支持UsernamePasswordToken
- @Override
- public boolean supports(AuthenticationToken token) {
- return token instanceof UsernamePasswordToken;
- }
- //认证
- @Override
- protected AuthenticationInfo doGetAuthenticationInfo(
- AuthenticationToken token) throws AuthenticationException {
- //从token中 获取用户身份信息
- String username = (String) token.getPrincipal();
- //拿username从数据库中查询
- //....
- //如果查询不到则返回null
- if(!username.equals("zhang")){//这里模拟查询不到
- return null;
- }
- //获取从数据库查询出来的用户密码
- String password = "123";//这里使用静态数据模拟。。
- //返回认证信息由父类AuthenticatingRealm进行认证
- SimpleAuthenticationInfo simpleAuthenticationInfo = new SimpleAuthenticationInfo(
- username, password, getName());
- return simpleAuthenticationInfo;
- }
- //授权
- @Override
- protected AuthorizationInfo doGetAuthorizationInfo(
- PrincipalCollection principals) {
- // TODO Auto-generated method stub
- return null;
- }
- }
shiro-realm.ini
- [main]
- #自定义 realm
- customRealm=cn.itcast.shiro.authentication.realm.CustomRealm1
- #将realm设置到securityManager
- securityManager.realms=$customRealm
散列算法
- 散列算法一般用于生成一段文本的摘要信息,散列算法不可逆,将内容可以生成摘要,无法将摘要转成原始内容。散列算法常用于对密码进行散列,常用的散列算法有MD5、SHA。
一般散列算法需要提供一个 salt(盐)与原始内容生成摘要信息,这样做的目的是为了安全性,比如:111111 的 md5 值是:96e79218965eb72c92a549dd5a330112,拿着 "96e79218965eb72c92a549dd5a330112" 去 md5 破解网站很容易进行破解,如果要是对 111111 和 salt(盐,一个随机数)进行散列,这样虽然密码都是 111111 加不同的盐会生成不同的散列值。
例子
- //md5加密,不加盐
- String password_md5 = new Md5Hash("111111").toString();
- System.out.println("md5加密,不加盐=" + password_md5);
- //md5加密,加盐,一次散列
- String password_md5_sale_1 = new Md5Hash("111111", "eteokues", 1).toString();
- System.out.println("password_md5_sale_1=" + password_md5_sale_1);
- String password_md5_sale_2 = new Md5Hash("111111", "uiwueylm", 1).toString();
- System.out.println("password_md5_sale_2=" + password_md5_sale_2);
- //两次散列相当于md5(md5())
- //使用SimpleHash
- String simpleHash = new SimpleHash("MD5", "111111", "eteokues", 1).toString();
- System.out.println(simpleHash);
在 realm 中使用
- @Override
- protected AuthenticationInfo doGetAuthenticationInfo(
- AuthenticationToken token) throws AuthenticationException {
- //用户账号
- String username = (String) token.getPrincipal();
- //根据用户账号从数据库取出盐和加密后的值
- //..这里使用静态数据
- //如果根据账号没有找到用户信息则返回null,shiro抛出异常"账号不存在"
- //按照固定规则加密码结果 ,此密码 要在数据库存储,原始密码 是111111,盐是eteokues
- String password = "cb571f7bd7a6f73ab004a70322b963d5";
- //盐,随机数,此随机数也在数据库存储
- String salt = "eteokues";
- //返回认证信息
- SimpleAuthenticationInfo simpleAuthenticationInfo = new SimpleAuthenticationInfo(
- username, password, ByteSource.Util.bytes(salt),getName());
- return simpleAuthenticationInfo;
- }
shiro-cryptography.ini
- [main]
- #定义凭证匹配器
- credentialsMatcher=org.apache.shiro.authc.credential.HashedCredentialsMatcher
- #散列算法
- credentialsMatcher.hashAlgorithmName=md5
- #散列次数
- credentialsMatcher.hashIterations=1
- #将凭证匹配器设置到realm
- customRealm=cn.itcast.shiro.authentication.realm.CustomRealm2
- customRealm.credentialsMatcher=$credentialsMatcher
- securityManager.realms=$customRealm
授权流程. png
Shiro 支持三种方式的授权:
- Subject subject = SecurityUtils.getSubject();
- if (subject.hasRole("admin")) {
- //有权限
- } else {
- //无权限
- }
- @RequiresRoles("admin")
- public void hello() {
- //有权限
- }
- <shiro:hasRole name="admin">
- 拥有admin角色才能看到我!
- </shiro:hasRole>
- [users]
- #用户zhang的密码是123,此用户具有role1和role2两个角色
- zhang=123,role1,role2
- wang=123,role2
- [roles]
- #角色role1对资源user拥有create、update权限
- role1=user:create,user:update
- #角色role2对资源user拥有create、delete权限
- role2=user:create,user:delete
- #角色role3对资源user拥有create权限
- role3=user:create
- 例子:
- 用户创建权限:user:create,或user:create:*
- 用户修改实例001的权限:user:update:001
- 用户实例001的所有权限:user:*:001
- @Test public void testPermission() {
- // 从ini文件中创建SecurityManager工厂
- Factory < SecurityManager > factory = new IniSecurityManagerFactory("classpath:shiro-permission.ini");
- // 创建SecurityManager
- SecurityManager securityManager = factory.getInstance();
- // 将securityManager设置到运行环境
- SecurityUtils.setSecurityManager(securityManager);
- // 创建主体对象
- Subject subject = SecurityUtils.getSubject();
- // 对主体对象进行认证
- // 用户登陆
- // 设置用户认证的身份(principals)和凭证(credentials)
- UsernamePasswordToken token = new UsernamePasswordToken("zhang", "123");
- try {
- subject.login(token);
- } catch(AuthenticationException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- // 用户认证状态
- Boolean isAuthenticated = subject.isAuthenticated();
- System.out.println("用户认证状态:" + isAuthenticated);
- // 用户授权检测 基于角色授权
- // 是否有某一个角色
- System.out.println("用户是否拥有一个角色:" + subject.hasRole("role1"));
- // 是否有多个角色
- System.out.println("用户是否拥有多个角色:" + subject.hasAllRoles(Arrays.asList("role1", "role2")));
- // subject.checkRole("role1");
- // subject.checkRoles(Arrays.asList("role1", "role2"));
- // 授权检测,失败则抛出异常
- // subject.checkRole("role22");
- // 基于资源授权
- System.out.println("是否拥有某一个权限:" + subject.isPermitted("user:delete"));
- System.out.println("是否拥有多个权限:" + subject.isPermittedAll("user:create:1", "user:delete"));
- //检查权限
- subject.checkPermission("sys:user:delete");
- subject.checkPermissions("user:create:1", "user:delete");
- }
- // 用户授权检测 基于角色授权
- // 是否有某一个角色
- System.out.println("用户是否拥有一个角色:" + subject.hasRole("role1"));
- // 是否有多个角色
- System.out.println("用户是否拥有多个角色:" + subject.hasAllRoles(Arrays.asList("role1", "role2")));
- subject.checkRole("role1");
- subject.checkRoles(Arrays.asList("role1", "role2"));
- // 基于资源授权
- System.out.println("是否拥有某一个权限:" + subject.isPermitted("user:delete"));
- System.out.println("是否拥有多个权限:" + subject.isPermittedAll("user:create:1", "user:delete"));
- subject.checkPermission("sys:user:delete");
- subject.checkPermissions("user:create:1", "user:delete");
- // 授权
- @Override
- protected AuthorizationInfo doGetAuthorizationInfo(
- PrincipalCollection principals) {
- // 获取身份信息
- String username = (String) principals.getPrimaryPrincipal();
- // 根据身份信息从数据库中查询权限数据
- //....这里使用静态数据模拟
- List<String> permissions = new ArrayList<String>();
- permissions.add("user:create");
- permissions.add("user.delete");
- //将权限信息封闭为AuthorizationInfo
- SimpleAuthorizationInfo simpleAuthorizationInfo = new SimpleAuthorizationInfo();
- for(String permission:permissions){
- simpleAuthorizationInfo.addStringPermission(permission);
- }
- return simpleAuthorizationInfo;
- }
- <!--shiro-->
- <filter>
- <filter-name>shiroFilter</filter-name>
- <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
- <init-param>
- <!-- 该值缺省为false,表示生命周期由SpringApplicationContext管理,设置为true则表示由ServletContainer管理 -->
- <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>
- <!-- Shiro 的Web过滤器 -->
- <bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean">
- <property name="securityManager" ref="securityManager" />
- <!-- 如果没有认证将要跳转的登陆地址,http可访问的url,如果不在表单认证过虑器FormAuthenticationFilter中指定此地址就为身份认证地址
- -->
- <property name="loginUrl" value="/login.action" />
- <!-- 没有权限跳转的地址 -->
- <property name="unauthorizedUrl" value="/refuse.jsp" />
- <!-- shiro拦截器配置 -->
- <property name="filters">
- <map>
- <entry key="authc" value-ref="formAuthenticationFilter" />
- </map>
- </property>
- <property name="filterChainDefinitions">
- <value>
- <!-- 必须通过身份认证方可访问,身份认 证的url必须和过虑器中指定的loginUrl一致 -->
- /loginsubmit.action = authc
- <!-- 退出拦截,请求logout.action执行退出操作 -->
- /logout.action = logout
- <!-- 无权访问页面 -->
- /refuse.jsp = anon
- <!-- roles[XX]表示有XX角色才可访问 -->
- /item/list.action = roles[item],authc /js/** anon /images/** anon /styles/**
- anon
- <!-- user表示身份认证通过或通过记住我认证通过的可以访问 -->
- /** = user
- <!-- /**放在最下边,如果一个url有多个过虑器则多个过虑器中间用逗号分隔,如:/**=u ser,roles[admin] -->
- </value>
- </property>
- </bean>
- <!-- 安全管理器 -->
- <bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager">
- <property name="realm" ref="userRealm" />
- </bean>
- <!-- 自定义 realm -->
- <bean id="userRealm" class="cn.itcast.ssm.realm.CustomRealm1">
- </bean>
- <!-- 基于Form表单的身份验证过滤器,不配置将也会注册此过虑器,表单中的用户账号、密码及loginurl将采用默认值,建议配置 -->
- <bean id="formAuthenticationFilter" class="org.apache.shiro.web.filter.authc.FormAuthenticationFilter">
- <!-- 表单中账号的input名称 -->
- <property name="usernameParam" value="usercode" />
- <!-- 表单中密码的input名称 -->
- <property name="passwordParam" value="password" />
- <!-- <property name="rememberMeParam" value="rememberMe"/>
- -->
- <!-- loginurl:用户登陆地址,此地址是可以http访问的url地址 -->
- <property name="loginUrl" value="/loginsubmit.action" />
- </bean>
- <!-- 开启aop,对类代理 -->
- <aop:config proxy-target-class="true">
- </aop:config>
- <!-- 开启shiro注解支持 -->
- <bean class="
- org.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor">
- <property name="securityManager" ref="securityManager" />
- </bean>
- // 查询列表
- @RequestMapping("/queryItem")
- @RequiresPermissions("item:query")
- public ModelAndView queryItem() throws Exception {
- public class CustomRealm1 extends AuthorizingRealm {
- @Autowired
- private SysService sysService;
- @Override
- public String getName() {
- return "customRealm";
- }
- // 支持什么类型的token
- @Override
- public boolean supports(AuthenticationToken token) {
- return token instanceof UsernamePasswordToken;
- }
- // 认证
- @Override
- protected AuthenticationInfo doGetAuthenticationInfo(
- AuthenticationToken token) throws AuthenticationException {
- // 从token中 获取用户身份信息
- String username = (String) token.getPrincipal();
- // 拿username从数据库中查询
- // ....
- // 如果查询不到则返回null
- if (!username.equals("zhang")) {// 这里模拟查询不到
- return null;
- }
- // 获取从数据库查询出来的用户密码
- String password = "123";// 这里使用静态数据模拟。。
- // 根据用户id从数据库取出菜单
- //...先用静态数据
- List<SysPermission> menus = new ArrayList<SysPermission>();;
- SysPermission sysPermission_1 = new SysPermission();
- sysPermission_1.setName("商品管理");
- sysPermission_1.setUrl("/item/queryItem.action");
- SysPermission sysPermission_2 = new SysPermission();
- sysPermission_2.setName("用户管理");
- sysPermission_2.setUrl("/user/query.action");
- menus.add(sysPermission_1);
- menus.add(sysPermission_2);
- // 构建用户身体份信息
- ActiveUser activeUser = new ActiveUser();
- activeUser.setUserid(username);
- activeUser.setUsername(username);
- activeUser.setUsercode(username);
- activeUser.setMenus(menus);
- // 返回认证信息由父类AuthenticatingRealm进行认证
- SimpleAuthenticationInfo simpleAuthenticationInfo = new SimpleAuthenticationInfo(
- activeUser, password, getName());
- return simpleAuthenticationInfo;
- }
- // 授权
- @Override
- protected AuthorizationInfo doGetAuthorizationInfo(
- PrincipalCollection principals) {
- // 获取身份信息
- ActiveUser activeUser = (ActiveUser) principals.getPrimaryPrincipal();
- //用户id
- String userid = activeUser.getUserid();
- // 根据用户id从数据库中查询权限数据
- // ....这里使用静态数据模拟
- List<String> permissions = new ArrayList<String>();
- permissions.add("item:query");
- permissions.add("item:update");
- // 将权限信息封闭为AuthorizationInfo
- SimpleAuthorizationInfo simpleAuthorizationInfo = new SimpleAuthorizationInfo();
- for (String permission : permissions) {
- simpleAuthorizationInfo.addStringPermission(permission);
- }
- return simpleAuthorizationInfo;
- }
- }
- //用户登陆页面
- @RequestMapping("/login")
- public String login()throws Exception{
- return "login";
- }
- // 用户登陆提交
- @RequestMapping("/loginsubmit")
- public String loginsubmit(Model model, HttpServletRequest request)
- throws Exception {
- // shiro在认证过程中出现错误后将异常类路径通过request返回
- String exceptionClassName = (String) request
- .getAttribute("shiroLoginFailure");
- if (UnknownAccountException.class.getName().equals(exceptionClassName)) {
- throw new CustomException("账号不存在");
- } else if (IncorrectCredentialsException.class.getName().equals(
- exceptionClassName)) {
- throw new CustomException("用户名/密码错误");
- } else{
- throw new Exception();//最终在异常处理器生成未知错误
- }
- }
- //系统首页
- @RequestMapping("/first")
- public String first(Model model)throws Exception{
- //主体
- Subject subject = SecurityUtils.getSubject();
- //身份
- ActiveUser activeUser = (ActiveUser) subject.getPrincipal();
- model.addAttribute("activeUser", activeUser);
- return "/first";
- }
- <!-- 退出拦截,请求logout.action执行退出操作 -->
- /logout.action = logout
- <!-- 凭证匹配器 -->
- <bean id="credentialsMatcher"
- class="org.apache.shiro.authc.credential.HashedCredentialsMatcher">
- <property name="hashAlgorithmName" value="md5" />
- <property name="hashIterations" value="1" />
- </bean>
- <!-- 自定义 realm -->
- <bean id="userRealm" class="cn.itcast.ssm.realm.CustomRealm1">
- <property name="credentialsMatcher" ref="credentialsMatcher" />
- </bean>
- public class CustomRealm1 extends AuthorizingRealm {
- @Autowired
- private SysService sysService;
- @Override
- public String getName() {
- return "customRealm";
- }
- // 支持什么类型的token
- @Override
- public boolean supports(AuthenticationToken token) {
- return token instanceof UsernamePasswordToken;
- }
- @Override
- protected AuthenticationInfo doGetAuthenticationInfo(
- AuthenticationToken token) throws AuthenticationException {
- // 从token中获取用户身份
- String usercode = (String) token.getPrincipal();
- SysUser sysUser = null;
- try {
- sysUser = sysService.findSysuserByUsercode(usercode);
- } catch (Exception e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- // 如果账号不存在
- if (sysUser == null) {
- throw new UnknownAccountException("账号找不到");
- }
- // 根据用户id取出菜单
- List<SysPermission> menus = null;
- try {
- menus = sysService.findMenuList(sysUser.getId());
- } catch (Exception e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- // 用户密码
- String password = sysUser.getPassword();
- //盐
- String salt = sysUser.getSalt();
- // 构建用户身体份信息
- ActiveUser activeUser = new ActiveUser();
- activeUser.setUserid(sysUser.getId());
- activeUser.setUsername(sysUser.getUsername());
- activeUser.setUsercode(sysUser.getUsercode());
- activeUser.setMenus(menus);
- SimpleAuthenticationInfo simpleAuthenticationInfo = new SimpleAuthenticationInfo(
- activeUser, password, ByteSource.Util.bytes(salt),getName());
- return simpleAuthenticationInfo;
- }
- @Override
- protected AuthorizationInfo doGetAuthorizationInfo(
- PrincipalCollection principals) {
- //身份信息
- ActiveUser activeUser = (ActiveUser) principals.getPrimaryPrincipal();
- //用户id
- String userid = activeUser.getUserid();
- //获取用户权限
- List<SysPermission> permissions = null;
- try {
- permissions = sysService.findSysPermissionList(userid);
- } catch (Exception e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- //构建shiro授权信息
- SimpleAuthorizationInfo simpleAuthorizationInfo = new SimpleAuthorizationInfo();
- for(SysPermission sysPermission:permissions){
- simpleAuthorizationInfo.addStringPermission(sysPermission.getPercode());
- }
- return simpleAuthorizationInfo;
- }
- }
- <!-- 安全管理器 -->
- <bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager">
- <property name="realm" ref="userRealm" />
- <property name="sessionManager" ref="sessionManager" />
- <property name="cacheManager" ref="cacheManager" />
- </bean>
- <!-- 缓存管理器 -->
- <bean id="cacheManager" class="org.apache.shiro.cache.ehcache.EhCacheManager">
- </bean>
- <!-- 安全管理器 -->
- <bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager">
- <property name="realm" ref="userRealm" />
- <property name="sessionManager" ref="sessionManager" />
- </bean>
- <!-- 会话管理器 -->
- <bean id="sessionManager" class="org.apache.shiro.web.session.mgt.DefaultWebSessionManager">
- <!-- session的失效时长,单位毫秒 -->
- <property name="globalSessionTimeout" value="600000" />
- <!-- 删除失效的session -->
- <property name="deleteInvalidSessions" value="true" />
- </bean>
- public class MyFormAuthenticationFilter extends FormAuthenticationFilter {
- protected boolean onAccessDenied(ServletRequest request, ServletResponse response, Object mappedValue) throws Exception {
- // 校验验证码
- // 从session获取正确的验证码
- HttpSession session = ((HttpServletRequest) request).getSession();
- //页面输入的验证码
- String randomcode = request.getParameter("randomcode");
- //从session中取出验证码
- String validateCode = (String) session.getAttribute("validateCode");
- if (!randomcode.equals(validateCode)) {
- // randomCodeError表示验证码错误
- request.setAttribute("shiroLoginFailure", "randomCodeError");
- //拒绝访问,不再校验账号和密码
- return true;
- }
- return super.onAccessDenied(request, response, mappedValue);
- }
- }
- <bean id="formAuthenticationFilter"
- class="org.apache.shiro.web.filter.authc.FormAuthenticationFilter">
- 改为
- <bean id="formAuthenticationFilter"
- class="cn.itcast.ssm.shiro.MyFormAuthenticationFilter">
- <TR>
- <TD>验证码:</TD>
- <TD><input id="randomcode" name="randomcode" size="8" />
- <img id="randomcode_img" src="${baseurl}validatecode.jsp" alt="" width="56" height="20" align='absMiddle' />
- <a href=javascript:randomcode_refresh()>刷新</a></TD>
- </TR>
- <!-- 安全管理器 -->
- <bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager">
- <property name="realm" ref="userRealm" />
- <property name="sessionManager" ref="sessionManager" />
- <property name="cacheManager" ref="cacheManager" />
- <!-- 记住我 -->
- <property name="rememberMeManager" ref="rememberMeManager" />
- </bean>
- <!-- rememberMeManager管理器 -->
- <bean id="rememberMeManager" class="org.apache.shiro.web.mgt.CookieRememberMeManager">
- <property name="cookie" ref="rememberMeCookie" />
- </bean>
- <!-- 记住我cookie -->
- <bean id="rememberMeCookie" class="org.apache.shiro.web.servlet.SimpleCookie">
- <constructor-arg value="rememberMe" />
- <!-- 记住我cookie生效时间30天 -->
- <property name="maxAge" value="2592000" />
- </bean>
- <bean id="formAuthenticationFilter"
- class="cn.itcast.ssm.shiro.MyFormAuthenticationFilter">
- <!-- 表单中账号的input名称 -->
- <property name="usernameParam" value="usercode" />
- <!-- 表单中密码的input名称 -->
- <property name="passwordParam" value="password" />
- <property name="rememberMeParam" value="rememberMe"/>
- <!-- loginurl:用户登陆地址,此地址是可以http访问的url地址 -->
- <property name="loginUrl" value="/loginsubmit.action" />
- </bean>
- <TR>
- <TD></TD>
- <TD>
- <input type="checkbox" name="rememberMe" />自动登陆
- </TD>
- </TR>
- anon
- org.apache.shiro.web.filter.authc.AnonymousFilter
- authc
- org.apache.shiro.web.filter.authc.FormAuthenticationFilter
- authcBasic
- org.apache.shiro.web.filter.authc.BasicHttpAuthenticationFilter
- perms
- org.apache.shiro.web.filter.authz.PermissionsAuthorizationFilter
- port
- org.apache.shiro.web.filter.authz.PortFilter
- rest
- org.apache.shiro.web.filter.authz.HttpMethodPermissionFilter
- roles
- org.apache.shiro.web.filter.authz.RolesAuthorizationFilter
- ssl
- org.apache.shiro.web.filter.authz.SslFilter
- user
- org.apache.shiro.web.filter.authc.UserFilter
- logout
- org.apache.shiro.web.filter.authc.LogoutFilter
- <%@ tagliburi="http://shiro.apache.org/tags" prefix="shiro" %>
来源: http://www.jianshu.com/p/1ce12657abc5