2015年1月22日星期四

Solaris 10(x86)构建Oracle 10g RAC之--配置系统环境(1)

本邮件内容由第三方提供,如果您不想继续收到该邮件,可 点此退订
Solaris 10(x86)构建Oracle 10g RAC之--配置系统环境(1)  阅读原文»

Solaris 10(x86)构建Oracle 10g RAC之--配置系统环境(1)

Solaris 10(x86)构建Oracle 10g RAC之--配置系统环境(1)

系统环境:

操作系统:Solaris 10(x86-64)

Cluster: Oracle CRS 10.2.0.1.0

Oracle: Oracle 10.2.0.1.0

如图所示:RAC 系统架构

wKiom1S_b-OSHjhcAAGktznT6W4920.jpg

本案例,通过Solairs 10(x86-64)系统,构建Oracle 10g 的RAC;共享存储采用RAW+ASM的方式进行管理。

一、操作系统环境

[root@node1:/]# uname -a

SunOS node1 5.10 Generic_142910-17 i86pc i386 i86pc

[root@node1:/]# isainfo -kv

64-bit amd64 kernel modules

1、网络配置(在所有节点)

  [root@node1:/]# cat /etc/inet/ipnodes  #  # Internet host table  #  ::1     localhost  127.0.0.1       localhost  192.168.8.11    node1   loghost  192.168.8.13    node1-vip  10.10.10.11     node1-priv  192.168.8.12   node2  192.168.8.14   node2-vip  10.10.10.12    node2-priv  

网络配置:

  配置vip network(node1):  [root@node1:/]# ifconfig e1000g0:1 plumb up  [root@node1:/]# ifconfig e1000g0:1 192.168.8.13 netmask 255.255.255.0  [root@node1:/]# ifconfig -a  lo0: flags=2001000849<UP,LOOPBACK,RUNNING,MULTICAST,IPv4,VIRTUAL> mtu 8232 index 1          inet 127.0.0.1 netmask ff000000  e1000g0: flags=1000843<UP,BROADCAST,RUNNING,MULTICAST,IPv4> mtu 1500 index 2          inet 192.168.8.11 netmask ffffff00 broadcast 192.168.8.255          ether 8:0:27:28:b1:8c  e1000g0:1: flags=4001000842<BROADCAST,RUNNING,MULTICAST,IPv4,DUPLICATE> mtu 1500 index 2          inet 192.168.8.13 netmask ffffff00 broadcast 192.168.8.255  e1000g1: flags=1000843<UP,BROADCAST,RUNNING,MULTICAST,IPv4> mtu 1500 index 3          inet 10.10.10.11 netmask ffffff00 broadcast 10.10.10.255          ether 8:0:27:6e:16:1  配置vip network(node2):  [root@node2:/]# ifconfig e1000g0:1 plumb up  [root@node2:/]# ifconfig e1000g0:1 192.168.8.14 netmask 255.255.255.0  [root@node2:/]# ifconfig -a  lo0: flags=2001000849<UP,LOOPBACK,RUNNING,MULTICAST,IPv4,VIRTUAL> mtu 8232 index 1          inet 127.0.0.1 netmask ff000000  e1000g0: flags=1000843<UP,BROADCAST,RUNNING,MULTICAST,IPv4> mtu 1500 index 2          inet 192.168.8.12 netmask ffffff00 broadcast 192.168.8.255          ether 8:0:27:1f:bf:4c  e1000g0:1: flags=1000843<UP,BROADCAST,RUNNING,MULTICAST,IPv4> mtu 1500 index 2          inet 192.168.8.14 netmask ffffff00 broadcast 192.168.8.255  e1000g1: flags=1000843<UP,BROADCAST,RUNNING,MULTICAST,IPv4> mtu 1500 index 3          inet 10.10.10.12 netmask ffffff00 broadcast 10.10.10.255          ether 8:0:27:a5:2c:db  

2、共享磁盘配置(在所有节点)

对于Oracle 10g RAC,OCR和VOTE DISK、DataBase需建立在共享存储设备上;OCR和VOTE DISK必须以raw的方式管理,而存放DataBase的磁盘必须以ASM的方式管理。

1、建立磁盘分区(raw)(在node1)

  在Solaris下建立raw应注意以下事项:  Use the fdisk command to create a Solaris partition on the disk if one does not already exist.  Solaris fdisk partitions must start at cylinder 1, not cylinder 0. If you create an fdisk partition, then you must label the disk before continuing.  Enter the partition command, followed by the print command to display the partition table for the disk that you want to use.  If necessary, create a single whole-disk slice, starting at cylinder 1.  Note:  To prevent Automatic Storage Management from overwriting the partition table, you cannot use slices that start at cylinder 0 (for example, slice 2).  注意:    在建立磁盘分区时,必须从cylinder 1开始,不能从cylinder 0开始!  建立磁盘分区  [root@node1:/]# format  Searching for disks...done  AVAILABLE DISK SELECTIONS:         0. c0t0d0 <DEFAULT cyl 2607 alt 2 hd 255 sec 63>            /pci@0,0/pci8086,2829@d/disk@0,0         1. c0t2d0 <DEFAULT cyl 2608 alt 2 hd 255 sec 63>            /pci@0,0/pci8086,2829@d/disk@2,0  Specify disk (enter its number): 1  selecting c0t2d0  [disk formatted]  format> p  WARNING - This disk may be in use by an application that has            modified the fdisk table. Ensure that this disk is            not currently in use before proceeding to use fdisk.  format> fdisk  No fdisk table exists. The default partition for the disk is:    a 100% "SOLARIS System" partition  Type "y" to accept the default partition,  otherwise type "n" to edit the   partition table.  y  format> p  PARTITION MENU:          0      - change `0' partition          1      - change `1' partition          2      - change `2' partition          3      - change `3' partition          4      - change `4' partition          5      - change `5' partition          6      - change `6' partition          7      - change `7' partition          select - select a predefined table          modify - modify a predefined partition table          name   - name the current table          print  - display the current table          label  - write partition map and label to the disk          !<cmd> - execute <cmd>, then return          quit  partition> p  Current partition table (original):  Total disk cylinders available: 2607 + 2 (reserved cylinders)  Part      Tag    Flag     Cylinders        Size            Blocks    0 unassigned    wm       0               0         (0/0/0)           0    1 unassigned    wm       0               0         (0/0/0)           0    2     backup    wu       0 - 2606       19.97GB    (2607/0/0) 41881455    3 unassigned    wm       0               0         (0/0/0)           0    4 unassigned    wm       0               0         (0/0/0)           0    5 unassigned    wm       0               0         (0/0/0)           0    6 unassigned    wm       0               0         (0/0/0)           0    7 unassigned    wm       0               0         (0/0/0)           0    8       boot    wu       0 -    0        7.84MB    (1/0/0)       16065    9 unassigned    wm       0               0         (0/0/0)           0  partition> 0  Part      Tag    Flag     Cylinders        Size            Blocks    0 unassigned    wm       0 -   16      133.35MB    (17/0/0)     273105  Enter partition id tag:  Enter partition permission flags[wm]:  Enter new starting cyl[0]: 1  Enter partition size[273105b, 17c, 17e, 133.35mb, 0.13gb]: 128mb  partition> 1  Part      Tag    Flag     Cylinders        Size            Blocks    1 unassigned    wm       0 -   16      133.35MB    (17/0/0)     273105  Enter partition id tag:  Enter partition permission flags[wm]:  Enter new starting cyl[0]: 18  Enter partition size[273105b, 17c, 34e, 133.35mb, 0.13gb]: 128mb  partition> 3  Part      Tag    Flag     Cylinders        Size            Blocks    3 unassigned    wm       0 -  652        5.00GB    (653/0/0)  10490445  Enter partition id tag:  Enter partition permission flags[wm]:  Enter new starting cyl[0]: 35  Enter partition size[10490445b, 653c, 687e, 5122.29mb, 5.00gb]: 5gb  partition> 4  Part      Tag    Flag     Cylinders        Size            Blocks    4 unassigned    wm       0 -  652        5.00GB    (653/0/0)  10490445  Enter partition id tag:  Enter partition permission flags[wm]:  Enter new starting cyl[0]: 688  Enter partition size[10490445b, 653c, 1340e, 5122.29mb, 5.00gb]: 5gb  partition> 6  Part      Tag    Flag     Cylinders        Size            Blocks    6 unassigned    wm       0 -  522        4.01GB    (523/0/0)   8401995  Enter partition id tag:  Enter partition permission flags[wm]:  Enter new starting cyl[0]: 689  Enter partition size[8401995b, 523c, 1211e, 4102.54mb, 4.01gb]: 4gb  partition> 7  Part      Tag    Flag     Cylinders        Size            Blocks    7 unassigned    wm       0 -  522        4.01GB    (523/0/0)   8401995  Enter partition id tag:  En
Spring Security 之身份认证  阅读原文»

Spring Security 之身份认证

Spring Security可以运行在不同的身份认证环境中,当我们推荐用户使用Spring Security进行身份认证但并不推荐集成到容器管理的身份认证中时,但当你集成到自己的身份认证系统时,它依然是支持的。

1. Spring Security中的身份认证是什么?

现在让我们考虑一下每个人都熟悉的标准身份认证场景:

(1)用户打算使用用户名和密码登陆系统

(2)系统验证用户名和密码合法

(3)得到用户信息的上下文(角色等信息)

(4)为用户建立一个安全上下文

(5)用户接下来可能执行一些权限访问机制下的受保护的操作,检查与当前安全上下文有关的必须的权限

上面前三步是身份认证的过程,接下来看看身份认证的详细过程:

(1)用户名和密码获得之后组合成UsernamePasswordAuthenticationToken的实例(前文讨论过的Authentication接口的实例)

(2)将该令牌传递给AuthenticationManager实例进行验证

(3)验证成功后,AuthenticationManager 会返回填充好的Authentication实例

(4)通过调用SecurityContextHolder.getContext().setAuthentication(...)建立安全上下文的实例,传递到返回的身份认证对象上

下面是进行身份认证的代码片段:

  import org.springframework.security.authentication.*;  import org.springframework.security.core.*;  import org.springframework.security.core.authority.SimpleGrantedAuthority;  import org.springframework.security.core.context.SecurityContextHolder;  public class AuthenticationExample {    private static AuthenticationManager am = new SampleAuthenticationManager();    public static void main(String[] args) throws Exception {      BufferedReader in = new BufferedReader(new InputStreamReader(System.in));      while(true) {        System.out.println("Please enter your username:");        String name = in.readLine();        System.out.println("Please enter your password:");        String password = in.readLine();        try {          Authentication request = new UsernamePasswordAuthenticationToken(name, password);          Authentication result = am.authenticate(request);          SecurityContextHolder.getContext().setAuthentication(result);          break;        } catch(AuthenticationException e) {          System.out.println("Authentication failed: " + e.getMessage());        }      }      System.out.println("Successfully authenticated. Security context contains: " +                SecurityContextHolder.getContext().getAuthentication());    }  }  class SampleAuthenticationManager implements AuthenticationManager {    static final List<GrantedAuthority> AUTHORITIES = new ArrayList<GrantedAuthority>();    static {      AUTHORITIES.add(new SimpleGrantedAuthority("ROLE_USER"));    }    public Authentication authenticate(Authentication auth) throws AuthenticationException {      if (auth.getName().equals(auth.getCredentials())) {        return new UsernamePasswordAuthenticationToken(auth.getName(),          auth.getCredentials(), AUTHORITIES);        }        throw new BadCredentialsException("Bad Credentials");    }  }  

我们写了一个小程序,要求用户输入用户名和密码并执行上述序列。我们实现的 AuthenticationManager 会验证用户名和密码是否一致,它分配了一个角色给每个用户。上面的输出类似于这样:

Please enter your username:

favboy

Please enter your password:

favccxx

Authentication failed:Bad Credentials

Please enter your username:

favboy

Please enter your password:

favboy

Successfully authenticated. Security context contains: \

org.springframework.security.authentication.UsernamePasswordAuthenticationToken@441d0230: \

Principal: bob; Password: [PROTECTED]; \

Authenticated: true; Details: null; \

Granted Authorities: ROLE_USER

注意,你通常不需要写任何代码。这个过程通常发生在内部,如web身份认证过滤器。上面的代码仅仅是告诉我们在Spring Security中使用身份认证是如此简单的事情。当 SecurityContextHolder 包含一个填充的 Authentication 对象时用户身份就完成了。

2. 直接设置 SecurityContextHolder的内容

实际上,Spring Security并不关心如何将 Authentication对象放到SecurityContextHolder中。唯一的关键就是 SecurityContextHolder需要在用户操作认证的 AbstractSecurityInterceptor 之前已经有了Authentication对象。

对于那些不是Spring Security的系统,你可以自己写过滤器或MVC控制器与身份认证系统进行集成。比如,你可能使用容器管理的身份认证系统从ThreadLocal或JNDI中得到用户。也可能你在一个拥有遗留的身份认证系统的公司工作,这是一个企业的"标准",对此你是无能为力的。在这种情形下,使用Spring Security提供身份认证是非常容易的,你只需要写一个过滤器读取第三方的用户信息,然后构建一个Spring Security特定的 Authentication对象,并把它放到AuthenticationContextHolder中即可。在这种情况下,你需要考虑自带的身份认证的基础信息。比如,你需要在响应到客户端之前,先创建一个HTTP session会话在请求之间缓存上下文。

3 在Web应用中使用身份认证

接下来,我们探究一下Web应用不配置web.xml安全策略的情况下如何使用Spring Security进行身份认证,如何建立用户身份认证和安全上下文?

下面是web应用身份认证的流程:

(1)访问某应用的首页,点击某个链接。

(2)发送一个请求到服务器,服务器判断用户是否正在访问受保护的资源。

(3)由于用户之前并未进行身份认证,服务器发送一个响应(该响应可能是HTTP响应代码,也可能直接跳转到某web页面)告诉用户必须进行身份认证。

(4)身份认证机制决定了浏览器是跳转到特定的web页面让用户填写form表单,或者浏览器以某种方式(基本的身份认证对话框、cookie或X.509证书)检索用户身份。

(5)浏览器发送响应(包含表单信息的HTTP POST请求或是包含用户身份认证详细信息的HTTP表头)回服务器。

(6)接下来,服务器会决定之前的凭证是否有效。如果有效的话,会进行下一步。否则的话,浏览器通常会询问是否需要重试。

(7)原始的请求会导致身份认证流程重新进行,重新判断用户有足够的权限访问受保护的资源,如果用户有权限的话,请求就是成功的。否则的话,会返回HTTP错误码403,表示用户没有权限操作。

Spring Security有具体的类负责上面的步骤,主要的类有ExceptionTranslationFilterAuthenticationEntryPoint和调用AuenticationManager的"身份认证机制"。

3.1 ExceptionTranslationFilter

顾名思义,ExceptionTranslationFilter是处理Spring Security中异常的过滤器,这些异常都是由提供身份认证服务的 AbstractSecurityInterceptor 抛出。

3.2 AuthenticationEntryPoint

上面步骤3的操作中是 AuenticationEntryPoint 的职责,你能想象每个web应用都有默认的身份认证测试,每个主要的身份认证系统都有 AuthenticationEntryPoint 实现,通常执行步骤3中描述的行动之一。

3.3 身份认证机制

阅读更多内容

没有评论:

发表评论