一、在web.xml中配置过滤器:
过滤器配置在Struts2过滤器的前面,拦截所有
过滤器的filter-name与spring配置文件过滤器bean的id一致-->shiroFilter
二、配置applicationContext-shiro.xml:
1、配置shiro的核心过滤器,过滤器的id与web.xml中的filter-name一致-->ShiroFilterFactoryBean
2、在核心过滤器中配置,安全管理器securityManager
未认证跳转的页面loginUrl
登录认证后的页面successUrl
认证后为授权的页面unauthorizedUrl
配置过滤器链filterChainDefinitions
anno未认证可以访问 /login.html* = anno
authc认证后可以访问
perms特点权限访问 /.. = perms[x,x,x...]
roles特点角色访问 /.. = roles[y,y,y...]
port特点端口可以访问
reset特点http请求可以访问
一个*指参数
两个*指子文件夹
3、配置安全管理器,DefaultWebSecurityManager
注入自定义realm
4、配置后处理器,生命周期,LifecycleBeanPostProcessor
三、在action层中:
1、创建Subject subject = SecurityUtils.getSubject();
2、创建一个UsernamePasswordToken将用户信息保存到token中
3、调用subject对象的login方法传入token
四、在自定义Realm中,继承AuthorizingRealm
1、在认证的方法中,doGetAuthenticationInfo,将token对象转为UsernamePasswordToken对象
2、根据token的getUsername()方法获取用户名,根据用户名查询用户
用户不存在返回null
用户存在,返回new SimpleAuthenticationInfo(user, user.getPassword(), getName());
认证后保存在Project中的用户信息;密码;realm名称;
3、在底层会比对查询的密码和用户输入的密码
4、在权限检验的方法中,doGetAuthorizationInfo
创建一个AuthorizationInfo的实现类对象SimpleAuthorizationInfo
回去Subject对象,该对象存储了用户的信息
调用subject对象的getPrincipal()方法,获取用户对象
查询用户的角色和权限信息,将这些信息存储到SimpleAuthorizationInfo中
返回SimpleAuthorizationInfo
底层会比对配置文件访问所需的权限与角色和返回的用户的有的角色和权限
五、拓展
一般过滤器链中的roles配置多个后就需要用户同时满足多个角色,但在实际情况中应该是或关系
如何配置角色或关系:
1、自定义一个过滤器,继承AuthorizationFilter
2、重写方法,根据getSubject(req,resp),创建一个Subject对象,该对象中有用户的角色信息和权限信息
3、将重写方法的Object参数转成数组,String[] rolesArray = (String[])mappedValue;
4、先判断数组是否为null或数组长度为空,如满足,则说明无角色限制,有权限访问,返回true
5、遍历数组,根据subject.hasRole(rolesArray[i])判断用户是否满足任意一个角色,若满足,则有权限访问,返回true
6、在spring的配置文件中,配置自定义过滤器的bean
7、在shiro的核心过滤器bean上设置depends-on="指定自定义过滤器的id"
8、在shiro的核心过滤器中配置自定义过滤器的参数filters,其为map集合
9、将过滤器链的roles替换为自定义过滤器
过滤器配置在Struts2过滤器的前面,拦截所有
过滤器的filter-name与spring配置文件过滤器bean的id一致-->shiroFilter
二、配置applicationContext-shiro.xml:
1、配置shiro的核心过滤器,过滤器的id与web.xml中的filter-name一致-->ShiroFilterFactoryBean
2、在核心过滤器中配置,安全管理器securityManager
未认证跳转的页面loginUrl
登录认证后的页面successUrl
认证后为授权的页面unauthorizedUrl
配置过滤器链filterChainDefinitions
anno未认证可以访问 /login.html* = anno
authc认证后可以访问
perms特点权限访问 /.. = perms[x,x,x...]
roles特点角色访问 /.. = roles[y,y,y...]
port特点端口可以访问
reset特点http请求可以访问
一个*指参数
两个*指子文件夹
3、配置安全管理器,DefaultWebSecurityManager
注入自定义realm
4、配置后处理器,生命周期,LifecycleBeanPostProcessor
三、在action层中:
1、创建Subject subject = SecurityUtils.getSubject();
2、创建一个UsernamePasswordToken将用户信息保存到token中
3、调用subject对象的login方法传入token
四、在自定义Realm中,继承AuthorizingRealm
1、在认证的方法中,doGetAuthenticationInfo,将token对象转为UsernamePasswordToken对象
2、根据token的getUsername()方法获取用户名,根据用户名查询用户
用户不存在返回null
用户存在,返回new SimpleAuthenticationInfo(user, user.getPassword(), getName());
认证后保存在Project中的用户信息;密码;realm名称;
3、在底层会比对查询的密码和用户输入的密码
4、在权限检验的方法中,doGetAuthorizationInfo
创建一个AuthorizationInfo的实现类对象SimpleAuthorizationInfo
回去Subject对象,该对象存储了用户的信息
调用subject对象的getPrincipal()方法,获取用户对象
查询用户的角色和权限信息,将这些信息存储到SimpleAuthorizationInfo中
返回SimpleAuthorizationInfo
底层会比对配置文件访问所需的权限与角色和返回的用户的有的角色和权限
五、拓展
一般过滤器链中的roles配置多个后就需要用户同时满足多个角色,但在实际情况中应该是或关系
如何配置角色或关系:
1、自定义一个过滤器,继承AuthorizationFilter
2、重写方法,根据getSubject(req,resp),创建一个Subject对象,该对象中有用户的角色信息和权限信息
3、将重写方法的Object参数转成数组,String[] rolesArray = (String[])mappedValue;
4、先判断数组是否为null或数组长度为空,如满足,则说明无角色限制,有权限访问,返回true
5、遍历数组,根据subject.hasRole(rolesArray[i])判断用户是否满足任意一个角色,若满足,则有权限访问,返回true
6、在spring的配置文件中,配置自定义过滤器的bean
7、在shiro的核心过滤器bean上设置depends-on="指定自定义过滤器的id"
8、在shiro的核心过滤器中配置自定义过滤器的参数filters,其为map集合
9、将过滤器链的roles替换为自定义过滤器