企业中老项目还在使用ssm框架。
(1)创建一个maven的web工程。
(2)ssm整合到web工程----省略
pom依赖
spring配置文件
web.xml配置文件
(3)整合shiro
1. 引入shiro的依赖
org.apache.shiro
shiro-spring
1.9.0
2. 修改spring配置文件
-
-
- <bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager">
- <property name="realm" ref="realm"/>
- bean>
-
- <bean id="realm" class="com.ykq.realm.MyRealm">
- <property name="credentialsMatcher" ref="credentialsMatcher"/>
- bean>
-
-
- <bean id="credentialsMatcher" class="org.apache.shiro.authc.credential.HashedCredentialsMatcher">
- <property name="hashAlgorithmName" value="MD5"/>
- <property name="hashIterations" value="1024"/>
- bean>
-
-
- <bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean">
-
- <property name="loginUrl" value="/login.jsp"/>
-
- <property name="unauthorizedUrl" value="/unauthorized.jsp"/>
-
- <property name="filterChainDefinitions">
- <value>
- /login=anon
- /**=authc
- value>
- property>
- bean>
shiro中内置很多过滤器,而每个过滤都有相应的别名. 
修改web.xml文件
-
- <filter>
- <filter-name>shiroFilterfilter-name>
- <filter-class>org.springframework.web.filter.DelegatingFilterProxyfilter-class>
- filter>
- <filter-mapping>
- <filter-name>shiroFilterfilter-name>
- <url-pattern>/*url-pattern>
- filter-mapping>
修改controller层
- @PostMapping("/login")
- public String login(String username,String password){
- Subject subject = SecurityUtils.getSubject();
- UsernamePasswordToken token=new UsernamePasswordToken(username,password);
- try {
- subject.login(token);
- return "redirect:/success.jsp";
- }catch (Exception e){
- return "redirect:/login.jsp";
- }
- }
realm:
-
- //AuthorizingRealm授权
- public class MyRealm extends AuthorizingRealm {
- @Autowired
- private UserService userService;
- protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {
- User user = (User) principalCollection.getPrimaryPrincipal();
- List
list = userService.findPermissionByUsername(user.getUserid()); - //把当前用户的权限封装到SimpleAuthorizationInfo SimpleAuthorizationInfo进行权限校验
- if (list!=null&&list.size()>0){
- SimpleAuthorizationInfo info = new SimpleAuthorizationInfo();
- info.addStringPermissions(list);
- return info;
- }
- return null;
- }
-
- protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken) throws AuthenticationException {
- //1. 根据token获取账号
- String username = (String) authenticationToken.getPrincipal();
- // System.out.println(username+"+++++++++++++++++++++++++");
- //2. 根据账号查询用户信息
- User user = userService.findByUsername(username);
- if (user!=null){
- //从数据库中获取密码
- //盐
- ByteSource byteSourceSalt=ByteSource.Util.bytes(user.getSalt());
- SimpleAuthenticationInfo info = new SimpleAuthenticationInfo(user,user.getUserpwd(),byteSourceSalt,this.getName());
- return info;
- }
- return null;
- }
- }
- <%@ page contentType="text/html;charset=UTF-8" language="java" %>
- <%@taglib prefix="shiro" uri="http://shiro.apache.org/tags" %>
- <html>
- <head>
- <title>Titletitle>
- head>
- <body>
- <h1>欢迎来到<shiro:principal property="username"/>的主页h1>
- <shiro:hasPermission name="user:query">
- <a href="/user/query">查询用户a>
- shiro:hasPermission>
- <shiro:hasPermission name="user:insert">
- <a href="/user/insert">增加用户a>
- shiro:hasPermission>
- <shiro:hasPermission name="user:delete">
- <a href="/user/delete">删除用户a>
- shiro:hasPermission>
- <shiro:hasPermission name="user:update">
- <a href="/user/update">修改用户a>
- shiro:hasPermission>
- <shiro:hasPermission name="user:export">
- <a href="/user/export">导出用户a>
- shiro:hasPermission>
-
- body>
- html>
可以在jsp中获取当前登录者的账号 
上面只是在网页中根据不同用户显示不同的菜单,这种方式只能防君子不能防小人。
拦截器---获取请求路径 然后根据你的路径判断当前用户是否具有该权限。
spring整合shiro时提供了一个注解:可以加载相应方法上。
- 1.开启shiro注解
- <bean id="lifecycleBeanPostProcessor"
- class="org.apache.shiro.spring.LifecycleBeanPostProcessor" />
- <bean
- class="org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator"
- depends-on="lifecycleBeanPostProcessor" />
- <bean
- class="org.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor">
- <property name="securityManager" ref="securityManager" />
- bean>
-
- 2.使用shiro注解
- @RequiresPermissions(value = {"/user/query","/user/aaa"},logical= Logical.OR)

全局异常处理:

所谓前后端完全分离:后端响应的都是json数据,而不再是网页。
1. 登录成功或者失败应该返回json数据
2. 当未登录时返回的也是json数据
3. 访问未授权的资源,也要分会json。
修改登录接口
创建一个过滤器,继承登录校验的某个接口。
- public class LoginFilter extends FormAuthenticationFilter {
- //没有登陆时经过该方法 要返回json数据必须重写该方法
- @Override
- protected boolean onAccessDenied(ServletRequest request, ServletResponse response) throws Exception {
- response.setContentType("application/json;charset=utf-8");
- PrintWriter writer = response.getWriter();
- CommonResult commonResult = new CommonResult(4001,"未登录",null);
- ObjectMapper objectMapper = new ObjectMapper();
- String json = objectMapper.writeValueAsString(commonResult);
- writer.print(json);//显影给客户json
- writer.flush();
- writer.close();
- return false;
- }
- }
(2)注册我们的过滤器 