一,功能
1,提供认证服务,通过他可以完成身份认证,让他去判断用户是否为真实的用户;
2,提供授权服务,识别用户是否有权限访问该服务;
3,提供回话管理服务
二,实现
1,实现认证服务功能
读取classpath下的shiro。ini文件,并通过工厂类来创建securitymanager对象,将对象放入securityutil中,供shiro框架随时读取;
通过securityutil类获取subject对象,其实就是当前用户;
创建一个usernamepasswordtoken 对象,通过subject对象的login方法让shiro进行用户认证。此时,shiro创建了一个session。
三,shiro调用流程
通过subject调用securitymanager,通过securitymanager调用realm,realm就是提供用户信息的数据源。
四,使用shiro
1,配置web.xml
<listener> <listener-class>org.apache.shiro.web.env.EnvironmentLoaderListener</listener-class> </listener> <filter> <filter-name>ShiroFilter</filter-name> <filter-class>org.apache.shiro.web.servlet.ShiroFilter</filter-class> </filter> <filter-mapping> <filter-name>ShiroFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> </web-app>通过environmentLoaderListener初始化securitymanager,并通过shirofilter认证和授权。
在shiro.ini中配置数据库信息
五,封装扩展shiro
1.配置smart-security.ini文件,实际是shiro。ini文件;
2,实现安全控制接口
提供一个名为smartSecurity的接口,需要实现三个方法:
根据用户名获取,密码在认证时调用,
根据用户名获取角色名集合,在授权时调用
根绝角色名获取操作名集合,在授权时需调用。
提供一个snartsecurity的实现类,完成相应的数据库操作
在smart.properties中配置
3,不配置web.xml
实现javax.servlet.servletContainerInitializer接口,并在classpath下的meta-inf/services/javax.servlet.servletContainerinitializer问见中添加实现ervletContainerinitializer的实现类,如:
该实现类如下:
public class SmartSecurityPlugin implements ServletContainerInitializer { public void onStartup(Set<Class<?>> c, ServletContext ctx) throws ServletException { //设置初始化参数 ctx.setInitParameter("shiroConfigLocations","classPath:smart-security.ini"); //注册listener ctx.addListener(EnvironmentLoaderListener.class); //注册filter FilterRegistration.Dynamic smartSecurityFilter = ctx.addFilter("SmartSecurityFilter",SmartSecurityFilter.class); smartSecurityFilter.addMappingForUrlPatterns(null,false,"/*"); }通过shiro提供的初始化参数来定制默认的shiro配置文件名,通过servletcontext注册listener和filter,这里注册的不是shirofilter,而是smartSecturityfilter,是filter的扩展。
4,实现认证特性
smartjdbcrealm:获取jdbc连接以及sql查询语句;
smartcustomrealm:
securityconfig:提供了一系列静态方法,用于获取smart。properties文件中的配置项。
securityConstatnt:常量类
5,实现securityhelper:提供登陆和注销方法,这些方法在controller中调用